以您熟悉的编程语言为例完成一个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