客户端代码:
package chat;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.io.DataOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.net.Socket;
import java.net.UnknownHostException;
public class chatClient extends Frame {
TextField tf = new TextField();
TextArea ta = new TextArea();
Socket client = null;
OutputStream out = null;
DataOutputStream dout = null;
public static void main(String[] args) {
chatClient chatF= new chatClient();
chatF.launchFrame();
}
private void launchFrame() {
setLocation(300,400); // 左、上距离
this.setSize(300,500); // 宽度,高度
add(tf,BorderLayout.SOUTH);
add(ta,BorderLayout.NORTH);
pack(); // 覆盖Textarea和textfield空白处
close(); //关闭窗口
tf.addActionListener(new TfListener()); // 注册监听器
setVisible(true);
connectServer(); // 连接服务器
}
// 连接服务器
private void connectServer() {
try {
client = new Socket("127.0.0.1",10000);
out = client.getOutputStream();
dout = new DataOutputStream(out);
} catch (UnknownHostException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
//关闭窗口
private void close() {
this.addWindowListener(new WindowAdapter() {
@Override
public void windowClosing(WindowEvent e) {
unconnect();
System.exit(0);
}
});
}
//在关闭窗口的时候,关闭连接
public void unconnect(){
try {
dout.flush();
dout.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
//监听从tf的文本到ta当中。
private class TfListener implements ActionListener{
@Override
public void actionPerformed(ActionEvent e) {
String str = tf.getText().trim();
ta.setText(str);
tf.setText("");
try {
dout.writeUTF(str);
} catch (IOException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
}
}
}
server端代码:
package chat;
import java.io.DataInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.ServerSocket;
import java.net.Socket;
/*
* 1)客户端发送消息,服务器可以接收了。
* 下一个版本要解决的:该版本存在客户端发送多条消息,服务器接收不到。
* 原因是第一次运行完之后,while(true)执行到socket.accept();阻塞主了,无法执行, dinput.readUTF();
* 解决办法:将socket.accept();移动到while语句外面。
*/
public class chatServer {
public static void main(String[] args) {
ServerSocket socket = null;
Socket s = null;
InputStream input = null;
DataInputStream dinput = null;
try{
socket = new ServerSocket(10000);
while(true){
s= socket.accept();
System.out.println("this is a server");
input = s.getInputStream();
dinput = new DataInputStream(input);
//
String str = dinput.readUTF();
System.out.println(str);
}
}catch (IOException e){
try {
dinput.close();
input.close();
} catch (IOException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
e.printStackTrace();
}
}
}