私は実際にプログラムを作成しようとしています:
public void setUpNetwork(){
try {
Socket sock = new Socket("localhost", 1101);
InputStreamReader read = new InputStreamReader(sock.getInputStream());
buff = new BufferedReader(read);
write = new PrintWriter(sock.getOutputStream());
System.out.println("Network Established");
} catch (UnknownHostException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
}
ここでは、ソケット接続が確立されると、ユーザーが入力したデータを印刷ストリームに渡してから、コンソールにデータを出力しようとしています。
私のサーバークラスにはこれだけしかありません:
ServerSocket server = new ServerSocket(1101);
Socket socket = server.accept();
これを実行すると (実行中に、最初にサーバーを実行し、次に ChatSetUp クラスを実行します)、コンソールに何も出力されません! sersock.accept() が異なるポートを持つソケット接続を提供し、クライアントがサーバーと通信できないためですか? その場合、入力ストリームを作成できるように、ソケット オブジェクトをサーバーから別のクラスにある setUpNetwork() に渡す必要があります。どうすればいいのですか?
編集:
プログラム全体をもう少し修正しました!私は Swing を使用して GUI を作成しています。ユーザーがテキスト フィールドにテキストを入力して [送信] をクリックすると、リスナーがトリガーされ、そこでテキストを PrintWriter に追加します。コード全体を以下に示します: ....setUpNetwork() もこのクラスの一部です (以下には含まれていません)。
編集:同じプログラムにサーバーコードを含め、サーバーの新しいスレッドを開始しました。
public class ChatGraphs {
JTextField field;
JTextArea area;
PrintWriter write;
BufferedReader buff;
Socket sock;
public static void main(String[] args) {
ChatGraphs grap = new ChatGraphs();
grap.doIt();
}
private void doIt() {
JFrame frame = new JFrame();
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
JPanel allPanel = new JPanel();
allPanel.setLayout(new BoxLayout(allPanel, BoxLayout.Y_AXIS));
JPanel areaPanel = new JPanel();
areaPanel.setLayout(new FlowLayout());
JLabel alabel = new JLabel("Chats");
area = new JTextArea(20, 50);
area.setEditable(false);
areaPanel.add(alabel);
areaPanel.add(area);
JPanel textPanel = new JPanel();
textPanel.setLayout(new FlowLayout());
JLabel flabel = new JLabel("Enter");
field = new JTextField(20);
JButton button = new JButton("Send");
button.addActionListener(new ButtonListen());
textPanel.add(flabel);
textPanel.add(field);
textPanel.add(button);
allPanel.add(areaPanel);
allPanel.add(textPanel);
ConnectServer con = new ConnectServer();
Thread t = new Thread(con);
t.start();
AddData add = new AddData();
Thread t1 = new Thread(add);
t1.start();
//setUpServer();
setUpClient();
frame.setSize(700,500);
frame.setVisible(true);
frame.getContentPane().add(allPanel);
}
public class ButtonListen implements ActionListener{
@Override
public void actionPerformed(ActionEvent arg0) {
write.println(field.getText());
write.flush();
field.setText("");
field.setRequestFocusEnabled(true);
}
}
private void setUpClient(){
try {
sock = new Socket("localhost", 1101);
InputStreamReader read = new InputStreamReader(sock.getInputStream());
buff = new BufferedReader(read);
System.out.println("Network Established");
} catch (UnknownHostException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
public class AddData implements Runnable{
@Override
public void run() {
String line="";
try {
while((line=buff.readLine())!=null){
System.out.println("Another net");
area.append(line);
}
buff.close();
write.close();
sock.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
public class ConnectServer implements Runnable{
public void run() {
ServerSocket sersock = null;
Socket sock = null;
try {
sersock = new ServerSocket(1101);
sock = sersock.accept();
write = new PrintWriter(sock.getOutputStream());
sersock.close();
sock.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
私が得る例外は次のとおりです。
Exception in thread "Thread-2" java.lang.NullPointerException
at org.sockets.ChatGraphs$AddData.run(ChatGraphs.java:120) // This line is : while((line=buff.readLine())!=null)
at java.lang.Thread.run(Unknown Source)
Network Established