案例介绍:
实现采用客户/服务器通信模式,基于TCP网络通信协议的多客户端简单应用
案例设计:
1.服务器端通过ServerSocket的accept方法等待客户端连接的到来
2.客户端向服务器端口发出TCP连接请求
3.服务器端accept方法接收请求,启动新线程处理与该客户端之间的通信服务器端主线程可继续等待客户端连接的请求
聊天客户端代码:
package com.iotek.test;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.Socket;
import java.net.SocketException;
public class ClientInputStream implements Runnable {
private Socket Socket=null;
public ClientInputStream(java.net.Socket socket) {
super();
Socket = socket;
}
@Override
public void run() {
try {
BufferedReader br=new BufferedReader(new InputStreamReader(Socket.getInputStream()));
while(true){
try {
String line=br.readLine();
System.out.println(line);
} catch (SocketException e) {
break;
}
}
br.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
聊天服务端代码:
package com.iotek.test;
import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;
public class ChatServer {
public static void main(String[] args) throws IOException {
ServerSocket serverSocket=new ServerSocket(8888);
int number=1;//保存客户端的个数
while(true){
Socket socket=serverSocket.accept();
System.out.println("客户端"+number+"连接成功");
//服务端开启一个独立的线程来对客户端进行读写操作
new Thread(new ServerStream(socket, number)).start();
number++;
}
}
}
客户输入流代码:
package com.iotek.test;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.Socket;
import java.net.SocketException;
public class ClientInputStream implements Runnable {
private Socket Socket=null;
public ClientInputStream(java.net.Socket socket) {
super();
Socket = socket;
}
@Override
public void run() {
try {
BufferedReader br=new BufferedReader(new InputStreamReader(Socket.getInputStream()));
while(true){
try {
String line=br.readLine();
System.out.println(line);
} catch (SocketException e) {
break;
}
}
br.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
客户输出流:
package com.iotek.test;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.Socket;
public class ClientOutputStream implements Runnable {
private Socket socket = null;
public ClientOutputStream(Socket socket) {
super();
this.socket = socket;
}
@Override
public void run() {
try {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
PrintWriter pw = new PrintWriter(socket.getOutputStream(), true);
while (true) {
String line = br.readLine();
pw.println(line);
if (line.equals("bye")) {
break;
}
}
br.close();
pw.close();
socket.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
服务流代码:
package com.iotek.test;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.Socket;
public class ServerStream implements Runnable {
private Socket socket=null;
private int number;
public ServerStream(Socket socket, int number) {
super();
this.socket = socket;
this.number = number;
}
@Override
public void run() {
try {
BufferedReader br=new BufferedReader(new InputStreamReader(socket.getInputStream()));
PrintWriter pw=new PrintWriter(socket.getOutputStream(),true);//自动清空缓冲区域
while(true){
String line=br.readLine();
System.out.println("客户端"+number+":"+line);
pw.println(line.toUpperCase());
if(line.equals("bye")){
System.out.println("客户端"+number+"已经断开连接");
break;
}
}
br.close();
pw.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}