使用Socket实现通信聊天室
通信聊天室是一个比较酷的项目。
建立通信聊天室之前我们会想到这些问题:
①聊天室得要有一个发送窗口和一个接受窗口,如何在这两个窗口建立联系?
②如何发送信息并且接受信息呢?
经过学习,我知道了使用JAVA中的Socket(客户端)和ServerSocket(服务器)两个API能够连接两个窗口。发送和接受的信息也可以通过获取服务器和客户端的输入输出流来实现。
接下来就好办多了。我们现在就只需要创建两个窗口,然后用Socket和ServerSocket将两个窗口连接,之后再将客户端输入的数据发送到服务器端并且显示出来就行。
关键点已经实现,再继续写下去就是考验基本功了。基本的窗体搭建和面向对象的程序设计思维。
话不多说,开始写代码!
首先我们先写一个普通的服务器端:
package ServletV1;import javax.swing.*;import java.awt.*;import java.io.IOException;import java.io.InputStream;import java.io.OutputStream;import .ServerSocket;import .Socket;//服务器端显示窗口public class TextServlet {private String s;public void init(){//创建一个带有JText能显示文字的的窗口JFrame jf=new JFrame("服务器");jf.setSize(500,500);jf.setLayout(new BorderLayout());JLabel label=new JLabel("13213213");JTextField textField=new JTextField("接收文字",30);Dimension d=new Dimension(50,100);textField.setPreferredSize(d);textField.add(label); JPanel jp=new JPanel();jp.add(textField);jf.add(jp,BorderLayout.NORTH);jf.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);jf.setVisible(true);//窗口设置好了,接下来将这个窗口变成服务器,使用ServerSockettry {//创建服务器,设置服务器端口ServerSocket ss=new ServerSocket(9999);//通过阻塞,如果客户端连接到了“9999”端口,便连上这个服务器Socket client=ss.accept();System.out.println("客户端成功连接到服务器");//取得客户端的输入输出流InputStream ins=client.getInputStream();OutputStream ous=client.getOutputStream();//取得客户端的文字并且显示在服务器端while(true){int n= ins.read();System.out.println("得到数字"+n);//将得到的消息写入文本框textField.setText(n+"");System.out.println("成功写到服务器");}} catch (IOException e) {e.printStackTrace();}}public static void main(String[] args){TextServlet ts=new TextServlet();ts.init();}}
现在服务器已经搭建好了,启动服务器,我们可以先用PowerShell端连接服务器
因为我们打印了注释,连接上后便会显示成功信息
接着在客户端按下键盘上的任意数值,服务器端的窗口都会显示相应的ASCALL码。
好了,接下来我们继续写一个客户端的窗体
先对连接服务器和发送信息给服务器的方法封装到类Clientnn中
package ClientV1;import java.io.IOException;import java.io.InputStream;import java.io.OutputStream;import .Socket;public class Clientonn {private InputStream ins;private OutputStream ous;/*** @sIP 服务器IP地址* @sPort 服务器端口号* 客户端连接服务器,并且获得客户端的输入输出流*/public boolean connect2Server(String sIP,int sPort){try {Socket client=new Socket(sIP,sPort);ins=client.getInputStream();ous=client.getOutputStream();System.out.println("连接到服务器并且获取到输入输出流");return true;} catch (IOException e) {e.printStackTrace();}return false;}/*** 发送数据给服务器*/public void send2Server(int s){try {this.ous.write(s);} catch (IOException e) {e.printStackTrace();}}}
然后在主类中创建窗体使用keylistener获取键盘按钮信息,并且调用Clientnn类中连接服务器和发送数据的方法
package ClientV1;import javax.swing.*;import java.awt.*;import java.awt.event.KeyEvent;import java.awt.event.KeyListener;//制作客户端界面public class WritClient {private int send;public void init(){//创建一个带有文字的窗口JFrame jf=new JFrame("客户端");jf.setSize(500,500);jf.setLayout(new BorderLayout());JTextField textField=new JTextField("发送信息:",30);Dimension d=new Dimension(50,100);textField.setPreferredSize(d);JPanel jp=new JPanel();jp.add(textField);jf.add(jp,BorderLayout.NORTH);jf.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);Clientonn cn=new Clientonn();if (cn.connect2Server("localhost",9999)){System.out.println("成功连接到服务器");}textField.addKeyListener(new KeyListener() {@Overridepublic void keyTyped(KeyEvent e) {}@Overridepublic void keyPressed(KeyEvent e) {send = e.getKeyChar();System.out.println("触发按钮监听器,得到:"+send);cn.send2Server(send);System.out.println("客户端传送一个数据"+send);}@Overridepublic void keyReleased(KeyEvent e) {}});jf.setVisible(true);}public static void main(String[] args){WritClient wc=new WritClient();wc.init();}}
运行效果如下,当在客户端的文本框中输入数据时,在服务器的文本框中会得到相应的ASCALL码
用Socket实现了发送和接收数据的功能,但是由于io流只能取得一个byte范围内的int型数据,还只能发送数据。如何能使得发送的数据不失真呢?这是我接下来需要更进一步学习的内容。
如果觉得《使用Socket实现通信聊天室》对你有帮助,请点赞、收藏,并留下你的观点哦!