大家好,欢迎来到IT知识分享网。
目录
一、 什么是Socket?
Socket(套接字),用来描述IP地址和端口,是通信链的句柄,是支持TCP/IP协议的网络通信的基本操作单元,是对网络通信过程中端点的抽象表示。
通过 socket 这种约定,一台计算机可以接收其他计算机的数据,也可以向其他计算机发送数据。Socket()函数返回一个整型的Socket描述符,随后的连接建立、数据传输等操作都是通过该Socket实现的。
插述:
TCP(Transmission Control Protocol)传输控制协议,是一种面向连接的、可靠的、基于字节流的通信协议。数据在传输前要建立连接,传输完毕后还要断开连接。客户端在收发数据前要使用 connect() 函数和服务器建立连接。建立连接的目的是保证IP地址、端口、物理链路等正确无误,为数据的传输开辟通道。
二、Socket通信模型
以下内容来源于菜鸟7.6.2 基于TCP协议的Socket通信(1) | 菜鸟教程 (runoob.com)
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