以您熟悉的编程语言为例完成一个hello/hi的简单的网络聊天程序
Socket通常也称作"套接字",用于描述IP地址和端口,是一个通信链的句柄,可以用来实现不同虚拟机或不同计算机之间的通信,应用程序通常通过"套接字"向网络发出请求或者应答网络请求。
java中利用 Socket 编写的通信程序。利用 TCP 协议进行通信的两个应用程序是有主次之分的,一个是服务器程序,一个是客户端程序,两者的功能和编写方法不太一样。其中 ServerSocket 类表示 Socket 服务器端,Socket 类表示 Socket 客户端,两者之间的交互过程如下:
- 服务器端创建一个 ServerSocket(服务器端套接字),调用 accept() 方法等待客户端来连接。
- 客户端程序创建一个 Socket,请求与服务器建立连接。
服务器接收客户的连接请求,同时创建一个新的 Socket 与客户建立连接,服务器继续等待新的请求。
下面简单介绍下seversocket和socket
ServerSocket 类是与 Socket 类相对应的用于表示通信双方中的服务器端,用于在服务器上开一个端口,被动地等待数据(使用 accept() 方法)并建立连接进行数据交互。
服务器套接字一次可以与一个套接字连接,如果多台客户端同时提出连接请求,服务器套接字会将请求连接的客户端存入队列中,然后从中取出一个套接字与服务器新建的套接字连接起来。
ServerSocket 的构造方法
ServerSocket 的构造方法有以下几种
- ServerSocket():无参构造方法。
- ServerSocket(int port):创建绑定到特定端口的服务器套接字。
- ServerSocket(int port,int backlog):使用指定的 backlog 创建服务器套接字并将其绑定到指定的本地端口。
- ServerSocket(int port,int backlog,InetAddress bindAddr):使用指定的端口、监听 backlog 和要绑定到本地的 IP 地址创建服务器。
Socket 类表示通信双方中的客户端,用于呼叫远端机器上的一个端口,主动向服务器端发送数据(当连接建立后也能接收数据)。
Socket 的构造方法
Socket 的构造方法如下所示。
- Socket():无参构造方法。
- Socket(InetAddress address,int port):创建一个流套接字并将其连接到指定 IP 地址的指定端口。
- Soclcet(InetAddress address,int port,InetAddress localAddr,int localPort):创建一个套接字并将其连接到指定远程地址上的指定远程端口。
- Socket(String host,int port):创建一个流套接字并将其连接到指定主机上的指定端口。
- Socket(String host,int port,InetAddress localAddr,int localPort):创建一个套接字并将其连接到指定远程地址上的指定远程端口。Socket 会通过调用 bind() 函数来绑定提供的本地地址及端口。
在java类ServerSocket创建时分别调用了linux中socket(),bind(),listen()接口,使服务器处于监听状态。seversocket.accept()方法调用了linux中accept接口,readLine方法调用recv接口,读取客户端传输的数据。
-
java实现hello/hi的简单的网络聊天程序
- 服务端
import java.io.*;
import java.net.*;
import java.util.*; public class Server implements Runnable {
private Socket socket;
Server(Socket sock) {
this.socket = sock;
}
public static void main(String args[])
throws Exception {
ServerSocket serverSocket = new ServerSocket(8868);
while (true) {
Socket sock = serverSocket.accept();
new Thread(new Server(sock)).start();
}
}
public void run() {
try {
InputStream in = socket.getInputStream(); byte[] buf = new byte[1024];
while(true)
{int len = in.read(buf); System.out.println(new String(buf,0,len));
} }
catch (IOException e) {
System.out.println(e);
}finally {
try {
socket.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}客户端
import java.io.*;
import java.net.*;
import java.util.*;
public class client{ public static void main(String[] args)throws Exception { Socket s = new Socket("127.0.0.1",8868); Scanner cout=new Scanner(System.in); OutputStream out = s.getOutputStream();
while(true){
String put=cout.next();
out.write(put.getBytes());
}
}
}运行效果
-
作者:SA19225179
参考资料来源:https://blog.csdn.net/vipshop_fin_dev/article/details/102966081
最新文章
- android textview 自动换行 整齐排版
- DataTable to Excel(使用NPOI、EPPlus将数据表中的数据读取到excel格式内存中)
- Filter
- Sharepoint 2010 工作流启动时处理表单出错
- Spring的特点
- location 、history
- [转]C程序内存区域分配(5个段作用)
- python访问mysql将返回的表转化为json
- 定时自动启动任务crontab命令用法
- Mapreduce执行过程分析(基于Hadoop2.4)——(一)
- 汇编语言程序入门实验二:在dos下建立子目录操作
- Unity3d Shader开发(四)UsePass ,GrabPass ,SubShader Tags
- C# 各种集合
- Day01
- Robotium源码分析之Instrumentation进阶
- requireJS 源码(二) data-main 的加载实现
- 配置服务器nginx 教程
- K-means算法性能评估及其优化
- 【Java并发编程二】Java并发包
- python内置模块之-logging