项目结构
服务端
Server.java
package tcp;
import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.ArrayList;
import java.util.List;
public class Server {
public static void main(String[] args) {
//保存已连接的客户端的集合
List<Socket> clients = new ArrayList<Socket>();
try {
//6666为自己设置的端口号
ServerSocket serversocket = new ServerSocket(6666);
System.out.println("****服务器启动,等待客户端的连接****");
while(true) {
Socket clientSocket = serversocket.accept();
clients.add(clientSocket);
new ServerThread(clientSocket,clients).start();
}
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
ServerThread.java
package tcp;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.InetSocketAddress;
import java.net.Socket;
import java.util.List;
public class ServerThread extends Thread {
Socket myClient;//新发消息的客户端
List<Socket> clients;//所有连接的的客户端
String clientHostname;//客户端IP
int clientport;//客户端端口号
public ServerThread(Socket myClient,List<Socket> clients) {
super();
this.myClient = myClient;
this.clients = clients;
}
public void run() {
InetSocketAddress clientAddress = (InetSocketAddress)myClient.getRemoteSocketAddress();
clientHostname = clientAddress.getHostName();
clientport = clientAddress.getPort();
System.out.println("第"+clients.size()+"个客户端:"+clientHostname+"已连接"+":"+clientport);
try {
String is;
BufferedReader in = new BufferedReader(new InputStreamReader(myClient.getInputStream()));
while((is=in.readLine())!=null) {
System.out.println(is+" 来自"+clientHostname+":"+clientport);
//输出到全部客户端
for (Socket client:clients) {
if(client!=null) {
PrintWriter out = new PrintWriter(client.getOutputStream(),true);
out.println(is+" 来自"+clientHostname+":"+clientport);
}
}
}
} catch (IOException e) {
System.err.println(clientHostname + ":" + clientport + "退出了。");
}
}
}
客户端
Client.java
package tcp;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.Socket;
import java.net.UnknownHostException;
public class Client {
public Client() {
String hostName = "";
int portNumber = 6666;
try {
Socket s = new Socket(hostName,portNumber);
//输出到服务器
PrintWriter out = new PrintWriter(s.getOutputStream(),true);
//接收服务器传来的数据
BufferedReader in = new BufferedReader(new InputStreamReader(s.getInputStream()));
//键盘输入此客户端要发送的数据
BufferedReader sin = new BufferedReader(new InputStreamReader(System.in));
//发送消息的线程
new Thread(new Runnable() {
@Override
public void run() {
// TODO Auto-generated method stub
String input;
try {
while((input = sin.readLine())!=null) {
//输出到服务器
out.println(input);
}
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
System.exit(1);
}
}
}).start();
//接收消息的线程
new Thread(new Runnable() {
@Override
public void run() {
// TODO Auto-generated method stub
String receiveStr;
try {
while((receiveStr = in.readLine())!=null) {
System.out.println("echo: " + receiveStr);
}
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
System.exit(1);
}
}
}).start();
} catch (UnknownHostException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
public static void main(String[] args) {
new Client();
}
}
运行结果
先启动服务器
客户端1
客户端2