GUIを使用してJavaでTCPクライアントサーバープログラムを作成しています。アイデアは、サーバー プログラムのテキスト フィールドから値を取得し、それをオブジェクトに格納して、クライアント側に送信することです。クライアント側はオブジェクトを逆シリアル化し、逆シリアル化されたオブジェクトの値でテキスト フィールドを更新します。
ChattingServer.java
public class ChattingServer extends JFrame {
private JTextField senddata;
private JTextField packettype;
private JTextField packetsize;
private JTextField offset;
private JButton sendButton;
private JButton startServer;
private TCPServer mServer;
private TCP_DATA_PACKET TDP;
sendButton = new JButton("Update");
sendButton.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
TDP.bSendRequestedData = senddata.getText().toString();
TDP.uPacketType = packettype.getText().toString();
TDP.uPacketSize = packetsize.getText().toString();
TDP.uOffset = offset.getText().toString();
mServer.SendObject(TDP);
}
});
startServer = new JButton("Start");
startServer.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
startServer.setEnabled(false);
try{
IP.setText(InetAddress.getLocalHost().getHostAddress());
} catch (UnknownHostException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
mServer = new TCPServer();
mServer.start();
}
});
public class TCPServer extends Thread{
public TCP_DATA_PACKET packet;
public final int SERVERPORT = Integer.parseInt(port.getText().toString());
private ObjectOutputStream mOut;
public void SendObject(Object obj){
try{
mOut.writeObject(this);
System.out.println("Object sent successfully!");
mOut.flush();
mOut.close();
}catch(IOException ioe){
System.out.println(ioe);
}
}
@SuppressWarnings("resource")
public void run() {
super.run();
try {
System.out.println("S: Connecting...");
ServerSocket serverSocket = new ServerSocket(SERVERPORT);
System.out.println("Server ip:" + InetAddress.getLocalHost().getHostAddress());
Socket client = serverSocket.accept();
System.out.println(client.getRemoteSocketAddress()+" connected\n");
ClientIP.setText(client.getRemoteSocketAddress().toString());
System.out.println("S: Receiving...");
try {
mOut = new ObjectOutputStream(client.getOutputStream());
} catch (Exception e) {
System.out.println("S: Error");
e.printStackTrace();
} finally {
client.close();
System.out.println("S: Done.");
}
} catch (Exception e) {
System.out.println("S: Error");
e.printStackTrace();
}
}
ChattingClient.java はまったく同じですが、オブジェクトのみを受け取ります
public class TCPServer extends Thread{
public TCP_DATA_PACKET packet = null;
public final int SERVERPORT = Integer.parseInt(port.getText().toString());
public final String SERVERADD = IP.getText().toString();
public boolean running = false;
public void run(){
super.run();
running = true;
try {
System.out.println("S: Connecting...");
InetAddress serverAddr = InetAddress.getByName(SERVERADD);
Socket client = new Socket(serverAddr,SERVERPORT);
try {
ObjectInputStream in = new ObjectInputStream(client.getInputStream());
while (running) {
packet = (TCP_DATA_PACKET)in.readObject();
if (packet!= null) {
senddata.setText(packet.bSendRequestedData);
packettype.setText(packet.uPacketType);
packetsize.setText(packet.uPacketSize);
offset.setText(packet.uOffset);
}
}
} catch (Exception e) {
System.out.println("S: Error");
e.printStackTrace();
} finally {
client.close();
System.out.println("S: Done.");
}
} catch (Exception e) {
System.out.println("S: Error");
e.printStackTrace();
}
}
ただし、サーバー側で NullPointer Exception が発生しています。
Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException
at ChattingServer$1.actionPerformed(ChattingServer.java:81)
で
TDP.bSendRequestedData = senddata.getText().toString();
の
sendButton.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
TDP.bSendRequestedData = senddata.getText().toString();
TDP.uPacketType = packettype.getText().toString();
TDP.uPacketSize = packetsize.getText().toString();
TDP.uOffset = offset.getText().toString();
mServer.SendObject(TDP);
}
});
クライアント側のEOF例外
ObjectInputStream in = new ObjectInputStream(client.getInputStream());
私はここで立ち往生しています...どんな助けもいただければ幸いです。前もって感謝します!!
編集: オブジェクト TDP を初期化して NullPointerException を修正しました:
TCP_DATA_PACKET TDP = new TCP_DATA_PACKET();
クライアントとサーバーの両方で。今、サーバー側でこの例外を取得しています
java.net.SocketException: Socket closed
クライアント側の同じEOF例外
java.io.EOFException
at java.io.ObjectInputStream$BlockDataInputStream.peekByte(Unknown Source)
at java.io.ObjectInputStream.readObject0(Unknown Source)
at java.io.ObjectInputStream.readObject(Unknown Source)
at ChattingClient$TCPServer.run(ChattingClient.java:132)
ここで何がうまくいかないのか教えてください。どんな助けでも大歓迎です。:)