栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

2021-10-11

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

2021-10-11

使用Socket实现通信聊天室

通信聊天室是一个比较酷的项目。
建立通信聊天室之前我们会想到这些问题:
①聊天室得要有一个发送窗口和一个接受窗口,如何在这两个窗口建立联系?
②如何发送信息并且接受信息呢?
经过学习,我知道了使用JAVA中的Socket(客户端)和ServerSocket(服务器)两个API能够连接两个窗口。发送和接受的信息也可以通过获取服务器和客户端的输入输出流来实现。
接下来就好办多了。我们现在就只需要创建两个窗口,然后用Socket和ServerSocket将两个窗口连接,之后再将客户端输入的数据发送到服务器端并且显示出来就行。
关键点已经实现,再继续写下去就是考验基本功了。基本的窗体搭建和面向对象的程序设计思维。
话不多说,开始写代码!
首先我们先写一个普通的服务器端:

package comV1.comServletV1;

import javax.swing.*;
import java.awt.*;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.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);
        //窗口设置好了,接下来将这个窗口变成服务器,使用ServerSocket
        try {
            //创建服务器,设置服务器端口
            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 comV1.comClientV1;

import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.Socket;

public class Clientonn {
    private InputStream ins;
    private OutputStream ous;

    
    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 comV1.comClientV1;

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() {
            @Override
            public void keyTyped(KeyEvent e) {

            }

            @Override
            public void keyPressed(KeyEvent e) {

                    send = e.getKeyChar();
                    System.out.println("触发按钮监听器,得到:"+send);
                    cn.send2Server(send);
                    System.out.println("客户端传送一个数据"+send);
            }

            @Override
            public void keyReleased(KeyEvent e) {

            }
        });

        jf.setVisible(true);
    }
    public static void main(String[] args){
        WritClient wc=new WritClient();
        wc.init();
    }
}

运行效果如下,当在客户端的文本框中输入数据时,在服务器的文本框中会得到相应的ASCALL码

用Socket实现了发送和接收数据的功能,但是由于io流只能取得一个byte范围内的int型数据,还只能发送数据。如何能使得发送的数据不失真呢?这是我接下来需要更进一步学习的内容。

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/314454.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号