
Бывалый

Профиль
Группа: Участник
Сообщений: 165
Регистрация: 24.7.2009
Репутация: нет Всего: нет
|
почитал, написал клиент/серверное приложение "простое". В начале запускается сервер который инициализирует "впускающий сокет" входящий поток символов переводит в верхний регистр используя функцию capitalizedSentence = clientSentence.toUpperCase() затем запускается клиент, в общем вот код: | Код |
/* * To change this template, choose Tools | Templates * and open the template in the editor. */
/* * CalculatorForm.java * * Created on Mar 17, 2010, 11:34:12 AM */
package GuiNet;
import java.util.logging.Level; import java.util.logging.Logger; import javax.swing.JOptionPane; import java.io.*; import java.io.InputStreamReader; import java.net.*;
/** * * @author max */ public class GuiForm extends javax.swing.JFrame {
/** Creates new form CalculatorForm */ public GuiForm() { initComponents(); }
/** This method is called from within the constructor to * initialize the form. * WARNING: Do NOT modify this code. The content of this method is * always regenerated by the Form Editor. */ @SuppressWarnings("unchecked") // <editor-fold defaultstate="collapsed" desc="Generated Code"> private void initComponents() {
jDialog1 = new javax.swing.JDialog(); jDialog2 = new javax.swing.JDialog(); jFrame1 = new javax.swing.JFrame(); IP1 = new javax.swing.JTextField(); Port = new javax.swing.JTextField(); jLabel1 = new javax.swing.JLabel(); jLabel2 = new javax.swing.JLabel(); jScrollPane1 = new javax.swing.JScrollPane(); TextForSend = new javax.swing.JTextPane(); Send = new javax.swing.JButton(); IP2 = new javax.swing.JTextField(); IP3 = new javax.swing.JTextField(); IP4 = new javax.swing.JTextField(); printMessage = new javax.swing.JLabel(); TCPServer = new javax.swing.JButton(); TcpClient = new javax.swing.JButton();
javax.swing.GroupLayout jDialog1Layout = new javax.swing.GroupLayout(jDialog1.getContentPane()); jDialog1.getContentPane().setLayout(jDialog1Layout); jDialog1Layout.setHorizontalGroup( jDialog1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addGap(0, 400, Short.MAX_VALUE) ); jDialog1Layout.setVerticalGroup( jDialog1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addGap(0, 300, Short.MAX_VALUE) );
javax.swing.GroupLayout jDialog2Layout = new javax.swing.GroupLayout(jDialog2.getContentPane()); jDialog2.getContentPane().setLayout(jDialog2Layout); jDialog2Layout.setHorizontalGroup( jDialog2Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addGap(0, 400, Short.MAX_VALUE) ); jDialog2Layout.setVerticalGroup( jDialog2Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addGap(0, 300, Short.MAX_VALUE) );
javax.swing.GroupLayout jFrame1Layout = new javax.swing.GroupLayout(jFrame1.getContentPane()); jFrame1.getContentPane().setLayout(jFrame1Layout); jFrame1Layout.setHorizontalGroup( jFrame1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addGap(0, 400, Short.MAX_VALUE) ); jFrame1Layout.setVerticalGroup( jFrame1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addGap(0, 300, Short.MAX_VALUE) );
setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);
IP1.setMaximumSize(new java.awt.Dimension(1, 1)); IP1.setMinimumSize(new java.awt.Dimension(1, 1)); IP1.setPreferredSize(new java.awt.Dimension(1, 1)); IP1.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { IP1ActionPerformed(evt); } });
Port.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { PortActionPerformed(evt); } });
jLabel1.setText("Enter IP");
jLabel2.setText("Enter port");
jScrollPane1.setViewportView(TextForSend);
Send.setText("Send"); Send.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { SendActionPerformed(evt); } });
IP2.setMaximumSize(new java.awt.Dimension(1, 1)); IP2.setMinimumSize(new java.awt.Dimension(1, 1)); IP2.setPreferredSize(new java.awt.Dimension(1, 1)); IP2.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { IP2ActionPerformed(evt); } });
IP3.setMaximumSize(new java.awt.Dimension(1, 1)); IP3.setMinimumSize(new java.awt.Dimension(1, 1)); IP3.setPreferredSize(new java.awt.Dimension(1, 1)); IP3.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { IP3ActionPerformed(evt); } });
IP4.setMaximumSize(new java.awt.Dimension(1, 1)); IP4.setMinimumSize(new java.awt.Dimension(1, 1)); IP4.setPreferredSize(new java.awt.Dimension(1, 1)); IP4.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { IP4ActionPerformed(evt); } });
printMessage.setText("Print message:");
TCPServer.setText("TCP Server"); TCPServer.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { TCPServerActionPerformed(evt); } });
TcpClient.setText("TCP Client"); TcpClient.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { TcpClientActionPerformed(evt); } });
javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane()); getContentPane().setLayout(layout); layout.setHorizontalGroup( layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup() .addContainerGap() .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING) .addGroup(javax.swing.GroupLayout.Alignment.LEADING, layout.createSequentialGroup() .addComponent(printMessage, javax.swing.GroupLayout.DEFAULT_SIZE, 296, Short.MAX_VALUE) .addGap(333, 333, 333)) .addComponent(Send) .addGroup(layout.createSequentialGroup() .addGap(33, 33, 33) .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addComponent(jLabel1) .addComponent(IP1, javax.swing.GroupLayout.PREFERRED_SIZE, 51, javax.swing.GroupLayout.PREFERRED_SIZE)) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) .addComponent(IP2, javax.swing.GroupLayout.PREFERRED_SIZE, 53, javax.swing.GroupLayout.PREFERRED_SIZE) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) .addComponent(IP3, javax.swing.GroupLayout.DEFAULT_SIZE, 55, Short.MAX_VALUE) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) .addComponent(IP4, javax.swing.GroupLayout.DEFAULT_SIZE, 55, Short.MAX_VALUE) .addGap(39, 39, 39) .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addGroup(layout.createSequentialGroup() .addComponent(Port, javax.swing.GroupLayout.PREFERRED_SIZE, 60, javax.swing.GroupLayout.PREFERRED_SIZE) .addGap(46, 46, 46) .addComponent(TcpClient) .addGap(18, 18, 18) .addComponent(TCPServer)) .addComponent(jLabel2))) .addComponent(jScrollPane1, javax.swing.GroupLayout.Alignment.LEADING, javax.swing.GroupLayout.DEFAULT_SIZE, 629, Short.MAX_VALUE)) .addGap(110, 110, 110)) ); layout.setVerticalGroup( layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addGroup(layout.createSequentialGroup() .addContainerGap() .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING) .addGroup(layout.createSequentialGroup() .addComponent(jLabel1) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) .addComponent(IP1, javax.swing.GroupLayout.DEFAULT_SIZE, 19, Short.MAX_VALUE) .addComponent(IP2, javax.swing.GroupLayout.DEFAULT_SIZE, 19, Short.MAX_VALUE) .addComponent(IP3, javax.swing.GroupLayout.DEFAULT_SIZE, 19, Short.MAX_VALUE) .addComponent(IP4, javax.swing.GroupLayout.DEFAULT_SIZE, 19, Short.MAX_VALUE))) .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) .addComponent(TcpClient) .addComponent(TCPServer)) .addGroup(layout.createSequentialGroup() .addComponent(jLabel2) .addGap(22, 22, 22)) .addComponent(Port, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)) .addGap(53, 53, 53) .addComponent(printMessage, javax.swing.GroupLayout.PREFERRED_SIZE, 144, javax.swing.GroupLayout.PREFERRED_SIZE) .addGap(18, 18, 18) .addComponent(jScrollPane1, javax.swing.GroupLayout.PREFERRED_SIZE, 113, javax.swing.GroupLayout.PREFERRED_SIZE) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED) .addComponent(Send) .addContainerGap()) );
pack(); }// </editor-fold>
private void PortActionPerformed(java.awt.event.ActionEvent evt) { // TODO add your handling code here: }
private void SendActionPerformed(java.awt.event.ActionEvent evt) { }
private void IP1ActionPerformed(java.awt.event.ActionEvent evt) { // TODO add your handling code here: }
private void IP2ActionPerformed(java.awt.event.ActionEvent evt) { // TODO add your handling code here: }
private void IP3ActionPerformed(java.awt.event.ActionEvent evt) { // TODO add your handling code here: }
private void IP4ActionPerformed(java.awt.event.ActionEvent evt) { // TODO add your handling code here: }
//for get Port public int getPort(){ try{ port = Integer.parseInt(this.Port.getText()); } catch(Exception e){ JOptionPane.showMessageDialog(this, "Bad enter port", "Error", WIDTH); return 0; }
return(Integer.parseInt(this.Port.getText())); }
//for get IP public String getIP(){
try{ getIP1 = Integer.parseInt(this.IP1.getText()); } catch(Exception e) { JOptionPane.showMessageDialog(this, "Bad first byte into IP", "Error", WIDTH); return null; }
try{ getIP2 = Integer.parseInt(this.IP2.getText()); } catch(Exception e) { JOptionPane.showMessageDialog(this, "Bad second byte into IP", "Error", WIDTH); return null; }
try{ getIP3 = Integer.parseInt(this.IP3.getText()); } catch(Exception e) { JOptionPane.showMessageDialog(this, "Bad third byte into IP", "Error", WIDTH); return null; }
try{ getIP4 = Integer.parseInt(this.IP4.getText()); } catch(Exception e) { JOptionPane.showMessageDialog(this, "Bad fourth byte into IP", "Error", WIDTH); return null; }
//send text for user try{ sendText = this.TextForSend.getText(); } catch(Exception e) { JOptionPane.showMessageDialog(this, "Error send text", "Error", WIDTH); return null; }
this.printMessage.setText(sendText);
String stringIP = null;
stringIP = this.IP1.getText(); stringIP +="."+this.IP2.getText(); stringIP +="."+this.IP3.getText(); stringIP +="."+this.IP4.getText();
return stringIP; }
private void TCPServerActionPerformed(java.awt.event.ActionEvent evt) { int strPort=0; strPort = getPort(); /* Здесь происходит создание объекта welcomeSocket типа ServerSocket. Объект welcomeSocket представляет собой ВПУСКАЮЩИЙ сокет, с помощью которого клиент устанавливает первоначальный контакт с сервером. Для этого сокета используется порт с номером 6789, совпадающим с номером порта сокета клиента. Протокол TCP устанавливает прямой виртуальный канал между сокетом clientSocket на клиентской стороне и connectionSocket на серверной стороне, после чего клиент и сервер могут свободно осуществлять обмен информацией. После создания сокета connectionSocket сервер может вновь использовать сокет welcomeSocket для инициирования других соединений с клиентами */ try { welcomeSocket = new ServerSocket(strPort); } catch (IOException ex) { Logger.getLogger(GuiForm.class.getName()).log(Level.SEVERE, null, ex); }
while(true) { try { connectionSocket = welcomeSocket.accept(); } catch (IOException ex) { Logger.getLogger(GuiForm.class.getName()).log(Level.SEVERE, null, ex); }
try { inFromClient = new BufferedReader(new InputStreamReader(connectionSocket.getInputStream())); } catch (IOException ex) { Logger.getLogger(GuiForm.class.getName()).log(Level.SEVERE, null, ex); }
try { outToClient = new DataOutputStream(connectionSocket.getOutputStream()); } catch (IOException ex) { Logger.getLogger(GuiForm.class.getName()).log(Level.SEVERE, null, ex); }
try { clientSentence = inFromClient.readLine(); } catch (IOException ex) { Logger.getLogger(GuiForm.class.getName()).log(Level.SEVERE, null, ex); } System.out.println("Received: " + clientSentence); capitalizedSentence = clientSentence.toUpperCase() + '\n';
try { outToClient.writeBytes(capitalizedSentence); } catch (IOException ex) { Logger.getLogger(GuiForm.class.getName()).log(Level.SEVERE, null, ex); } }
}
private void TcpClientActionPerformed(java.awt.event.ActionEvent evt) { //Получить IP с формы String strIP=null; int strPort=0; strIP = getIP(); strPort = getPort(); /* * Здесь происходит создание потокового объекта in From User типа BufferedReader. * Инициализация потока данных производится объектом System.in, связывающим поток * со стандартным устройством ввода. После выполнения этой команды клиенту начинают * передаваться символы, вводимые пользователем с клавиатуры. */ inFromUser = new BufferedReader( new InputStreamReader(System.in));
/* * В приведенной строке происходит создание объекта clientSocket типа Socket. * Кроме того, при этом инициируется TCP-соединение между клиентом и сервером. * Слово hostname необходимо заменить именем хоста, сохранив кавычки * (например, “_fling.seas.upenn.edu”). Перед началом установки TCP-соединения клиент * производит DNS-запрос IP-адреса хоста. Значение 6789 — это номер порта; * вы можете выбрать другое число, однако необходимо помнить, что клиентская и серверная * стороны должны использовать один и тот же номер порта. Как упоминалось ранее, * IP-адрес хоста в совокупности с номером порта приложения идентифицирует серверный процесс. */ if(strIP != null && strPort != 0) { System.out.println("Мой адрес"+strIP); try { clientSocket = new Socket(strIP, strPort); } catch (UnknownHostException ex) { Logger.getLogger(GuiForm.class.getName()).log(Level.SEVERE, null, ex); } catch (IOException ex) { Logger.getLogger(GuiForm.class.getName()).log(Level.SEVERE, null, ex); } }
/* * Здесь происходит создание потоковых объектов, связанных с сокетом. * Поток outToServer обеспечивает вывод программы через сокет, а поток inFromServer * предназначен для приема данных от серверной стороны */ try { outToServer = new DataOutputStream(clientSocket.getOutputStream()); } catch (IOException ex) { Logger.getLogger(GuiForm.class.getName()).log(Level.SEVERE, null, ex); }
try { inFromServer = new BufferedReader(new InputStreamReader(clientSocket.getInputStream())); } catch (IOException ex) { Logger.getLogger(GuiForm.class.getName()).log(Level.SEVERE, null, ex); }
/* * Эта строка помещает последовательность символов, вводимых пользователем, * в переменную sentence. Ввод оканчивается нажатием пользователем клавиши Enter. * Как видим, для помещения символов в переменную используется потоковый объект inFromUser. */ try { sentence = inFromUser.readLine(); } catch (IOException ex) { Logger.getLogger(GuiForm.class.getName()).log(Level.SEVERE, null, ex); } /* * Здесь строка sentence, снабженная символом возврата каретки, * помещается в выходной поток outToServer. После этого она будет передана через сокет в канал, * соединяющий клиента с сервером. */ try { outToServer.writeBytes(sentence + '\n'); } catch (IOException ex) { Logger.getLogger(GuiForm.class.getName()).log(Level.SEVERE, null, ex); } /* * Ответ сервера принимается во входной поток inFromServer, * откуда принятая строка копируется в переменную modifiedSentence. * Помещение символов в строку modifiedSentence продолжается до тех пор, * пока не будет получен символ возврата каретки. */ try { modifiedSentence = inFromServer.readLine(); } catch (IOException ex) { Logger.getLogger(GuiForm.class.getName()).log(Level.SEVERE, null, ex); }
System.out.println("FROM SERVER: " + modifiedSentence); try { clientSocket.close(); } catch (IOException ex) { Logger.getLogger(GuiForm.class.getName()).log(Level.SEVERE, null, ex); } }
/** * @param args the command line arguments */ public static void main(String args[]) { java.awt.EventQueue.invokeLater(new Runnable() { public void run() { new GuiForm().setVisible(true); } }); }
//ip forms variables private int getIP1; private int getIP2; private int getIP3; private int getIP4; private int port; private String sendText;
//server variables private Socket connectionSocket; private BufferedReader inFromClient; private DataOutputStream outToClient; private String clientSentence; private String capitalizedSentence; private ServerSocket welcomeSocket;
//Client variables private BufferedReader inFromServer; private BufferedReader inFromUser; private DataOutputStream outToServer; private Socket clientSocket; private String sentence; //хранения строки, вводимой пользователем и передаваемой серверу private String modifiedSentence; //Принимает от сервера и выводимую на стандартное устройство вывода.
// Variables declaration - do not modify private javax.swing.JTextField IP1; private javax.swing.JTextField IP2; private javax.swing.JTextField IP3; private javax.swing.JTextField IP4; private javax.swing.JTextField Port; private javax.swing.JButton Send; private javax.swing.JButton TCPServer; private javax.swing.JButton TcpClient; private javax.swing.JTextPane TextForSend; private javax.swing.JDialog jDialog1; private javax.swing.JDialog jDialog2; private javax.swing.JFrame jFrame1; private javax.swing.JLabel jLabel1; private javax.swing.JLabel jLabel2; private javax.swing.JScrollPane jScrollPane1; private javax.swing.JLabel printMessage; // End of variables declaration
}
|
вопросы: 0) первая итерация между клиент/сервером проходит успешно, т.е. в ответ получаю строку в верхнем регистре, остальные вводимые мной строчки не переводятся и не приходят обратно от сервера, в чём может быть проблема? 1) при использовании GUI нажатии кноки @Start Server@ кнопка залипает и программа больше не реагируют ни на какаие команды, т.е. сервер запускается в бесконечном цикле опрашивая порт "входящий" как можно организовать "запуск/остановку" сервера через GUI
|