Java学习之Socket编程

做~自己de王妃 提交于 2020-03-22 05:00:50

什么是Socket

Java中的Socket编程其实就是网络编程,一般使用基于TCP/IP协议的Socket编程。所有关于Socket编程的API都在Java.net包里,一般实现客户端和服务器端之间的通讯。

Socket通讯的过程

Server端Listen(监听)某个端口是否有连接请求,Client端向Server 端发出Connect(连接)请求,Server端向Client端发回Accept(接受)消息。一个连接就建立起来了。Server端和Client 端都可以通过Send,Write等方法与对方通信。

对于一个功能齐全的Socket,都要包含以下基本结构,其工作过程包含以下四个基本的步骤:

  1. 创建Socket;
  2. 打开连接到Socket的输入/出流;
  3. 按照一定的协议对Socket进行读/写操作;
  4. 关闭Socket。

    socket编程要求

    服务器的位置必须得是固定的,
    1
    ServerSocket server=new ServerSocket(6789);

注:端口号的分配必须是唯一的,因为端口是为了唯一标识每台计算机唯一服务的。另外端口号是从0到65535之间的,前1024个端口已经被TCP/IP作为保留端口,因此你所分配的端口只能是1024个之后的。

1
Socket socket = server.accept();

 

注:accept方法是一个阻塞方法,在服务器端与客户端之间建立联系之前会一直等待阻塞。

在客户端中,用如下代码打开一个socket:

1
Socket client = new Socket("127.0.0.1", 8919); //两个参数(host,port)

 

注:host即客户端需要连接的机器,port就是服务器端用来监听请求的端口。

例子:

我们从客户端的Socket对象中得到OutputStream对象,然后写入数据后。很类似文件IO的处理代码。

123456789101112131415
public class ClientSocket {     public static void main(String args[]) {        String host = "127.0.0.1";         int port = "8919";         try{               Socket client = new Socket(host ,port );               Writer writer = new OutputStreamWriter(client.getOutputStream());               writer.writer("Hello From Client");               writer.flush();               writer.close();               client.close();             } catch (IOException e) {                    e.printStackTrace();            }}

 

在服务器端创建一个Socket,

12345678910111213141516171819202122
public class ServerClient {    public static void main(String[] args) {       int port = 8919;       try {        ServerSocket server = new ServerSocket(port);        Socket socket = server.accept();        Reader reader = new InputStreamReader(socket.getInputStream());        char chars[] = new char[1024];        int len;        StringBuilder builder = new StringBuilder();        while ((len=reader.read(chars)) != -1) {        builder.append(new String(chars, 0, len));        }        System.out.println("Receive from client message=: " + builder);        reader.close();        socket.close();        server.close();        } catch (Exception e) {        e.printStackTrace();   }  }}

 

支持多客户的client/server程序

前面的Client/Server程序只能实现Server和一个客户的对话。在实际应用中,往往是在服务器上运行一个永久的程序,它可以接收来自其他多个客户端的请求,提供相应的服务。为了实现在服务器方给多个客户提供服务的功能,需要对上面的程序进行改造,利用多线程实现多客户机制。服务器总是在指定的端口上监听是否有客户请求,一旦监听到客户请求,服务器就会启动一个专门的服务线程来响应该客户的请求,而服务器本身在启动完线程之后马上又进入监听状态,等待下一个客户的到来。

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!