基于GUI的网络通信程序设计(Java)

使用 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();
			}
		}	
	}
}

  • 0
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值