Socket通信

Socket通信Socket简单的带界面的聊天程序,带注解。

大家好,欢迎来到IT知识分享网。

目录

一、 什么是Socket?

插述:

二、Socket通信模型

1.服务端

2.客户端

三、代码实现

服务端

客户端

四、总结

 


一、 什么是Socket?

Socket(套接字),用来描述IP地址和端口,是通信链的句柄,是支持TCP/IP协议的网络通信的基本操作单元,是对网络通信过程中端点的抽象表示。
通过 socket 这种约定,一台计算机可以接收其他计算机的数据,也可以向其他计算机发送数据。Socket()函数返回一个整型的Socket描述符,随后的连接建立、数据传输等操作都是通过该Socket实现的。

插述:

TCP(Transmission Control Protocol)传输控制协议,是一种面向连接的、可靠的、基于字节流的通信协议。数据在传输前要建立连接,传输完毕后还要断开连接。客户端在收发数据前要使用 connect() 函数和服务器建立连接。建立连接的目的是保证IP地址、端口、物理链路等正确无误,为数据的传输开辟通道。

二、Socket通信模型

以下内容来源于菜鸟7.6.2 基于TCP协议的Socket通信(1) | 菜鸟教程 (runoob.com)

watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBA5aqb5ZWK772e,size_20,color_FFFFFF,t_70,g_se,x_16

 

Socket通信实现步骤解析

Step 1:创建ServerSocket和Socket

Step 2:打开连接到的Socket的输入/输出流

Step 3:按照协议对Socket进行读/写操作

Step 4:关闭输入输出流,以及Socket

三、Socket编写

1.服务端

先创建ServerSocket对象,用来绑定监听的端口;

再调用accept()方法来监听客户端的请求;

连接建立后,通过输入流读取客户端发送的请求信息,通过输出流向客户端发送响应信息;

最后记得关闭相关资源。

2.客户端

先创建Socket对象,要指明需要链接的服务器的地址和端号,即两个参数;

链接建立后,通过输出流向服务器发送请求信,通过输出流获取服务器响应的信息;

最后关闭相关资源

三、代码实现

带界面的聊天程序:

package Java_网络编程.带界面的聊天程序;

import javax.swing.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;
import java.text.SimpleDateFormat;
import java.util.Date;

/**
 * @Date: 2021/10/29 - 10 - 29 - 11:35
 * @Description:
 */
public class ChatFrame extends JFrame implements ActionListener {
    JTextField tf;//文本输入框
    JTextArea ta;//接收所有聊天记录
    JScrollPane sp;//滚动面板
    JButton send;
    JPanel p;//面板最下面的
    int port;//定义端口变量
    String s="";
    String myID;
    Date date;
    ServerSocket server;//服务器的对象
    Socket mysocket;//用来进行socket连接的对象
    BufferedReader is;//用来接收输入
    PrintWriter os;//往外发送输出
    String line;
    public ChatFrame(String ID,String remoteID,String IP,int port,boolean isServer){
        super(ID);
        myID=ID;
        this.port=port;
        ta=new JTextArea();
        ta.setEditable(false);//文本区域不可编辑
        sp=new JScrollPane(ta);
        this.setSize(330,400);
        this.setResizable(false);//不能改变窗口大小
        try {//设置界面风格,这是系统的显示风格
            UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
        }catch (Exception e){
            System.out.println("UI error");
        }
        this.getContentPane().add(sp,"Center");//将滚动面板放在整个区域中央
        p=new JPanel();
        this.getContentPane().add(p,"South");
        send=new JButton("发送");
        tf=new JTextField(20);//文本输入区域宽度20个字符
        tf.requestFocus();//要求光标放在文本输入框上面
        p.add(tf);
        p.add(send);
        this.setDefaultCloseOperation(EXIT_ON_CLOSE);//设置可以退出
        this.setVisible(true);//可以显示
        send.addActionListener(this);//注册监听器,当前对象处理
        tf.addActionListener(this);
        //谁当服务器,谁当客户端
        if(isServer){
            try {//服务端
                server=null;
                try {
                    server=new ServerSocket(port);
                }catch (Exception e){
                    System.out.println("can not listen to:"+e);
                }
                mysocket=null;
                try{
                    mysocket=server.accept();
                }catch (Exception e){
                    System.out.println("Error:"+e);
                }
                is=new BufferedReader(new InputStreamReader(mysocket.getInputStream()));
                os=new PrintWriter(mysocket.getOutputStream());
            }catch (Exception e){
                System.out.println("Error:in server client socket"+e);
            }
        }else {
            try{//客户端
                mysocket=new Socket(IP,port);
                os=new PrintWriter(mysocket.getOutputStream());
                is=new BufferedReader(new InputStreamReader(mysocket.getInputStream()));
            }catch (Exception e){
                System.out.println("Error:in client socket"+e);
            }
        }
        while (true){//一直循环
            try {
                line=is.readLine();//获得输入
                date=new Date();
                //显示日期的格式: 年月日时分秒
                SimpleDateFormat formatter=new SimpleDateFormat("yyy-MM-dd HH:mm:ss");
                String currentTime=formatter.format(date);//获取并转化为字符穿
                s+=currentTime+""+remoteID+"说:\n"+line+"\n";
                ta.setText(s);//显示文本区域上
            }catch (Exception e){
                System.out.println("Error:in receuve remote information"+e);
            }
        }
    }
    public void actionPerformed(ActionEvent e){//事件处理,捕捉信息
        date=new Date();//获得信息
        SimpleDateFormat formatter=new SimpleDateFormat("yyyy-MM-ss HH:mm:ss");
        String currentTime=formatter.format(date);//当前时间转换格式
        s+=currentTime+""+myID+"说:\n"+tf.getText()+"\n";
        ta.setText(s);//显示文本
        os.println(tf.getText());//刚文本框输入信息打印
        os.flush();//输出去,相当于从本地发送给另外聊天方
        tf.setText("");//把发送完的消息清理
        tf.requestFocus();//文本框获得焦点
    }
}

服务端

package Java_网络编程.带界面的聊天程序;

/**
 * @Date: 2021/11/6 - 11 - 06 - 16:34
 * @Description:
 */
public class ChatServerFrame {
    public static void main(String[] args) {
        ChatFrame cserver=new ChatFrame("cat","dog","127.0.0.1",2009,true);
    }
}

客户端

package Java_网络编程.带界面的聊天程序;

/**
 * @Date: 2021/11/6 - 11 - 06 - 16:36
 * @Description:
 */
public class ChatClientFrame {
    public static void main(String[] args) {
        ChatFrame cclient=new ChatFrame("Dog","Cat","127.0.0.1",2009,false);
    }
}

四、总结

​
//创建Socket 客户端对象
Socket s = new Socket("127.0.0.1",6666);
//创建ServerSocket 服务器端对象。。
ServerSocket ss = new ServerSocket(6666);
//监听服务器连接
s = ss.accept();

​

 

 

免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。 本文来自网络,若有侵权,请联系删除,如若转载,请注明出处:https://yundeesoft.com/9802.html

(0)

相关推荐

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注

关注微信