使用 socket 实现了服务端与多个客户端之间的双向通信
服务端
package exp;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.HashMap;
public class ServerFrame extends Frame implements ActionListener{
Panel pNorth, pSouth;
Label portLabel, sayLabel;
TextField portTf, sayTf;
Button startBtn, sayBtn;
TextArea ta;
Choice socketChoice = new Choice();
static int clientNum = 0;
ServerSocket serverSocket;
HashMap<String, Socket> socketMap = new HashMap<String, Socket>();
ServerListenThread serverListenThread = new ServerListenThread();
ServerFrame(String name) {
super(name);
}
void draw() {
pNorth = new Panel();
portLabel = new Label("Port:"); pNorth.add(portLabel);
portTf = new TextField("8080", 60); pNorth.add(portTf);
startBtn = new Button("Start"); pNorth.add(startBtn);
startBtn.addActionListener(this);
this.add(pNorth, "North");
ta = new TextArea(10, 80);
this.add(ta, "Center");
pSouth = new Panel();
socketChoice.add("choose"); pSouth.add(socketChoice);
sayTf = new TextField("", 60); pSouth.add(sayTf);
sayBtn = new Button("Say"); pSouth.add(sayBtn);
sayBtn.addActionListener(this);
this.add(pSouth, "South");
this.setSize(650, 400);
this.setVisible(true);
}
@Override
public void actionPerformed(ActionEvent e) {
Object source = e.getSource();
if (source == startBtn) {
ServerListenThread t = new ServerListenThread();
t.start();
ta.append("Server is listening on port:" + portTf.getText() + "\n");
startBtn.setEnabled(false);
} else if (source == sayBtn){
OutputStream output;
try {
String toClient = socketChoice.getSelectedItem();
Socket socket = socketMap.get(toClient);
OutputStream out = socket.getOutputStream();
BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(out, "GBK"));
String msg = sayTf.getText();
sayTf.setText("");
ta.append("Server: " + msg + "\n");
writer.write(msg);
writer.newLine();
writer.flush();
} catch (Exception e2) {
e2.printStackTrace();
}
}
}
class ServerListenThread extends Thread {
@Override
public void run() {
try {
int port = Integer.parseInt(portTf.getText());
serverSocket = new ServerSocket(port);
while(true) {
Socket s = serverSocket.accept();
clientNum++;
String clientName = "client-" + clientNum;
ta.append(clientName + "connect\n");
socketMap.put(clientName, s);
socketChoice.add(clientName);
ServerRecvThread t = new ServerRecvThread(s, clientNum);
t.start();
}
} catch(Exception e) {
e.printStackTrace();
}
}
}
class ServerRecvThread extends Thread {
Socket s1;
int num = 0;
public ServerRecvThread(Socket s1, int num) {
this.s1 = s1;
this.num = num;
}
@Override
public void run (){
InputStream in;
try {
in = s1.getInputStream();
BufferedReader reader = new BufferedReader(new InputStreamReader(in, "GBK"));
String msg = reader.readLine();
ta.append("client-" + num + ": " + msg + "\n");
} catch (IOException e) {
e.printStackTrace();
}
}
}
public static void main(String[] args) {
ServerFrame sf = new ServerFrame("服务端");
sf.draw();
}
}
客户端
package exp;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.net.Socket;
public class ClientFrame extends Frame implements ActionListener{
Socket s;
Panel pNorth, pSouth;
TextField ipTf, portTf, sayTf;
Label topLabel, ipLabel, portLabel, sayLabel;
Button connectBtn, sayBtn;
TextArea ta;
Choice socketChoice;
ClientFrame(String name) {
super(name);
}
public static void main(String[] args) {
ClientFrame cf = new ClientFrame("客户端");
cf.draw();
}
void draw() {
pNorth = new Panel();
ipLabel = new Label("Server IP:"); pNorth.add(ipLabel);
ipTf = new TextField("127.0.0.1", 20); pNorth.add(ipTf);
portLabel = new Label("Server Port: "); pNorth.add(portLabel);
portTf = new TextField("8080", 20); pNorth.add(portTf);
connectBtn = new Button("Connect"); pNorth.add(connectBtn);
connectBtn.addActionListener(this);
this.add(pNorth, "North");
ta = new TextArea(10, 80);
this.add(ta, "Center");
pSouth = new Panel();
sayLabel = new Label("Say:"); pSouth.add(sayLabel);
sayTf = new TextField("", 64); pSouth.add(sayTf);
sayBtn = new Button("Say"); pSouth.add(sayBtn);
sayBtn.addActionListener(this);
socketChoice = new Choice(); pSouth.add(socketChoice);
this.add(pSouth, "South");
this.pack();
this.setSize(650, 400);
this.setVisible(true);
}
@Override
public void actionPerformed(ActionEvent e) {
Object source = e.getSource();
if (source == connectBtn) {
String ip = ipTf.getText();
int port = Integer.parseInt(portTf.getText());
try {
s = new Socket(ip, port);
ta.append("connect to the server..\n");
ClientRecvThread t = new ClientRecvThread();
t.start();
} catch (Exception e2) {
e2.printStackTrace();
}
connectBtn.setEnabled(false);
} else if (source == sayBtn){
try {
OutputStream output = s.getOutputStream();
BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(output, "GBK"));
String msg = sayTf.getText();
sayTf.setText("");
ta.append(msg + "\n");
writer.write(msg);
writer.newLine();
writer.flush();
} catch (Exception e2) {
e2.printStackTrace();
}
}
}
class ClientRecvThread extends Thread {
@Override
public void run() {
try {
while(true) {
InputStream input = s.getInputStream();
BufferedReader br = new BufferedReader(new InputStreamReader(input, "GBK"));
String msg = br.readLine();
ta.append("Server: " + msg + "\n");
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
}