通过网络编程实现聊天室

随着网络的发展,人与人之间的距离被拉近,再也不是从前一生只够爱一个人的时代。TCP/IP协议规范了网络上通信设备之间的数据往来格式和传送方式,使我们能够实现远距离的交互。

TCP/IP通信协议是一种可靠的、双向的、持续的、点对点的网络协议,使用该协议时会在通信两端各建立一个Socket,从而实现通信两端的连接。

下面通过实现聊天室进行对Socket和ServerSocket进行解释。

编写ChatClient类实现客户端界面,并且通过Socket连接服务器

首先编写一个聊天室面板

JPanel panel;
JScrollPane sPane;
JTextArea txtContent;
JLabel lblName,lblSend;
JTextField txtName,txtSend;
JButton btnSend;

public ChatClient() {
	super("聊天室");
	txtContent=new JTextArea();
	txtContent.setEditable(false);
	sPane=new JScrollPane(txtContent);
	lblName=new JLabel("昵称:");
	txtName=new JTextField(5);
	lblSend=new JLabel("发言:");
	txtSend=new JTextField(20);
	btnSend=new JButton("发送");
	panel=new JPanel();
	panel.add(lblName);
	panel.add(txtName);
	panel.add(lblSend);
	panel.add(txtSend);
	panel.add(btnSend);
	this.add(panel, BorderLayout.SOUTH);
	this.add(sPane);
	this.setSize(500,300);
	this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
	}

创建Socket对象连接服务器,实现两个客户端的通信

	socket=new Socket("127.0.0.1",28888);
	pWriter=new PrintWriter(socket.getOutputStream());//创建输出流,向服务器发送信息
	bReader=new BufferedReader(new InputStreamReader(socket.getInputStream()));//创建输入流,读服务器的返回信息

对面板设置监听

btnSend.addActionListener(new ActionListener() {
	public void actionPerformed(ActionEvent e) {
		String strName=txtName.getText();
		String strMsg=txtSend.getText();
		if(!strMsg.equals("")) {
			pWriter.println(strName+strMsg);
			pWriter.flush();
			txtSend.setText("");
		}
	}
});

创建线程用于接收返回值

class GetMsgFromServer extends Thread{
	public void run() {
		while(this.isAlive()) {
			try {
				String strMsg=bReader.readLine();
				if(strMsg!=null) {
					txtContent.append(strMsg+"\n");
				}
				Thread.sleep(50);
			}catch(Exception e) {
				e.printStackTrace();
			}
		}
	}
}
创建ChatServer类实现聊天室服务器端,当该类接收到客户端的Socket连接时,则建立服务器与该客户端的连接

创建ServerSocket对象实现对上面指定端口的监听

ServerSocket serverSocket;//声明
...
serverSocket=new ServerSocket(28888);//在28888端口监听

创建一个线程用于接收客户端的Socket

class AcceptSocketThread extends Thread{
	public void run() {
		while(this.isAlive()) {
			try {
				Socket socket=serverSocket.accept();//接收Socket对象
				if(socket!=null) {
					BufferedReader bReader=new BufferedReader(new InputStreamReader(socket.getInputStream()));
					bReaders.add(bReader);
					new GetMsgFromClient(bReader).start();
					pWriters.add(new PrintWriter(socket.getOutputStream()));
				}
			}catch(IOException e) {
				e.printStackTrace();
			}
		}
	}
}

通过创建GetMsgFromClient线程用于接收聊天信息,创建SendMsgToClient线程将消息发送给所有客户端实现聊天室服务器端功能。

总结

网络编程能够实现客户端与服务器的连接使不同的客户端之间能够实现数据交互和信息交流,正是由于这些,使我们能够更加方便的去学习更多的东西。

你可能感兴趣的:(通过网络编程实现聊天室)