一个简单的javaTCP通讯程序
Server(服务器端)类
package com.tcp;
import java.io.*;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.*;
public class Server{
public static ArrayList<Socket> sockets = new ArrayList<>();//在线客户端
public static void main(String[] args) throws IOException {
//开启服务器
var serverSocket = new ServerSocket(8999);
while (true){
//接收客户端连接
new MessageHandler(serverSocket.accept()).start();
}
}
static class MessageHandler extends Thread{
private Socket socket;
public MessageHandler(Socket socket){
super();
this.socket = socket;
sockets.add(socket);
}
@Override
public void run() {
System.out.println(socket.getInetAddress() + " 上线");
try{
BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(socket.getInputStream()));
PrintStream printStream = new PrintStream(socket.getOutputStream());
String content;
while ((content = bufferedReader.readLine()) != null && !content.equalsIgnoreCase("EXIT")){
sendToOthers(content);
}
printStream.println("bye!");
System.out.println(socket.getInetAddress() + "断开连接! ");
socket.close();
}catch (IOException e){
System.out.println(socket.getInetAddress() +" 掉线了");
e.printStackTrace();
}
}
synchronized public void sendToOthers(String content){
Iterator<Socket> iterator = sockets.iterator();
while (iterator.hasNext()){
Socket s = null;
try {
s = iterator.next();
//消息转发到其余客户端
if (!s.equals(socket)) {
PrintStream printStream = new PrintStream(s.getOutputStream());
printStream.println(s.getInetAddress() + ": " + content);
}else {
System.out.println("地址: " + s.getInetAddress() + "说: " + content);
}
} catch (IOException e) {
iterator.remove();
}
}
}
public Socket getSocket() {
return socket;
}
public void setSocket(Socket socket) {
this.socket = socket;
}
}
}
Client(客户端)类
package com.tcp;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintStream;
import java.net.Socket;
import java.util.Scanner;
public class Client {
private Socket socket;
private boolean flag = true;
private SendThread sendThread;
private ReceiveThread receiveThread;
private Client() {
}
private Client(Socket socket) {
this.socket = socket;
sendThread = new SendThread();
receiveThread = new ReceiveThread();
}
static class Clients {
public static Client getClient(Socket socket) {
return new Client(socket);
}
}
class SendThread extends Thread {
@Override
public void run() {
try (Scanner input = new Scanner(System.in)) {
PrintStream printStream = new PrintStream(socket.getOutputStream());
while (flag) {
//发送给服务器
String content = input.nextLine();
printStream.println(content);
if (content.equalsIgnoreCase("EXIT")) {
flag = false;
}
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
class ReceiveThread extends Thread {
@Override
public void run() {
try (BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(socket.getInputStream()))){
while (flag) {
String line = bufferedReader.readLine();//是阻塞方法, 所以为了避免一直阻塞下面加上服务器最后返回bye!时结束线程
System.out.println(line);
if (line.equals("bye!")){
break;
}
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
public ReceiveThread getReceiveThread() {
return receiveThread;
}
public SendThread getSendThread() {
return sendThread;
}
public void setFlag(boolean flag) {
this.flag = flag;
}
public Socket getSocket() {
return socket;
}
public void setSocket(Socket socket) {
this.socket = socket;
}
}
启动客户端实例:
package com.tcp;
import java.io.IOException;
import java.net.Socket;
public class DoIt {
public static void main(String[] args) throws IOException {
Socket socket = new Socket("xxx.xxx.xxx.xxx", 8999);
Client client = Client.Clients.getClient(socket);
var sendThread = client.getSendThread();
var receiveThread = client.getReceiveThread();
sendThread.start();
receiveThread.start();
try {
sendThread.join();
receiveThread.join();
} catch (InterruptedException e) {
e.printStackTrace();
}
socket.close();
}
}