使用Socket实现通信聊天室

使用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;

    /**
     * @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 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型数据,还只能发送数据。如何能使得发送的数据不失真呢?这是我接下来需要更进一步学习的内容。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

吴澳

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值