运用学过的Tcp网络编程可以实现一个简单的群聊,其代码如下:
服务器端的代码如下:
public class TcpServer {
//因为ArrayList本身不是线程安全的,所以通过集合Collections.synchronizedList将其转换为一个线程安全的类
public static List<Socket> listSocket = Collections.synchronizedList(new ArrayList<Socket>());
public static void main(String[] args) throws IOException {
ServerSocket ss = new ServerSocket(30000);
while(true) {
/* 监听客户端的连接,返回一个对应的Socket对象,这
是一个阻塞方法,如果accept得不到一个客户端,他就一直会
在这里等待客户端的连接,直到有一个客户端连上来才执行结束。*/
Socket socket = ss.accept();
listSocket.add(socket);
new Thread(new TepServerThread(socket)).start();
}
}
}
TepServerThread里头的代码如下:
public class TcpServerThread implements Runnable {
Socket socket;
BufferedReader br;
public TcpServerThread(Socket socket) throws IOException {
this.socket = socket;
br = new BufferedReader(new InputStreamReader(socket.getInputStream()));
}
@Override
public void run() {
try {
String content;
while ((content = read()) != null) {
System.out.println("--------------server---------------");
System.out.println(content);
for (Socket s : TcpServer.listSocket) {
PrintWriter pw = new PrintWriter(s.getOutputStream());
pw.println(content);
pw.flush();//发送出去
}
}
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
private String read() {
try {
return br.readLine();
} catch (IOException e) {
TcpServer.listSocket.remove(socket);
}
return null;
}
}
客户端代码如下:
public class TcpClient {
public static void main(String[] args) throws IOException {
Socket socket = new Socket("127.0.0.1", 30000);
new Thread(new TcpClientThread(socket)).start();
//客户端输入聊天信息,
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
String line;
PrintWriter pw = new PrintWriter(socket.getOutputStream());
while((line = br.readLine()) != null) {
System.out.println("--------------client---------------");
pw.println(line);
pw.flush();//发送消息出去
}
}
}
TcpClientThread里头代码如下:
public class TcpClientThread implements Runnable {
private Socket socket;
BufferedReader br;
public TcpClientThread(Socket socket) throws IOException {
this.socket = socket;
br = new BufferedReader(new InputStreamReader(socket.getInputStream()));
}
@Override
public void run() {
try {
String content;
while((content = br.readLine()) != null) {
System.out.println(content + "-------------");
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
感兴趣的朋友可以试试!有不当之处请指出,谢谢。可以参考这里