当前位置: 首页 > 教程 > Java网络编程 >

Java Socket

精华
小牛编辑
114浏览
2023-03-14

1 什么是Java Socket编程

Java Socket编程用于在不同JRE上运行的应用程序之间的通信。

Java Socket编程可以是面向连接的或无连接的。

Socket和ServerSocket类用于面向连接的Socket编程,DatagramSocket和DatagramPacket类用于无连接Socket编程。

Socket编程中的客户端必须知道两个信息:

  • 服务短的IP地址
  • 服务端端口号

要完成Socket编程,我们需要使用两个类:Socket和ServerSocket。

Socket类:用于通信客户端和服务器。通过此类,我们可以读写消息。

ServerSocket类:在服务器端使用。ServerSocket类的accept() 方法将阻止控制台,直到客户端连接为止。客户端成功连接后,它将在服务器端返回Socket的实例。

2 Java Socket类

Socket只是机器之间通信的端点。Socket类可用于创建Socket。

2.1 Java Socket类的方法

方法 描述
public InputStream getInputStream() 返回与Socket连接的InputStream。
public OutputStream getOutputStream() 返回与Socket连接的OutputStream。
public synchronized void close() 关闭Socket

3 Java ServerSocket类

ServerSocket类可用于创建服务端的Socket。该对象用于与客户端建立通信。

3.1 Java ServerSocket类的方法

方法 描述
public Socket accept() 返回Socket,并在服务器和客户端之间建立连接。
public synchronized void close() 关闭ServerSocket。

4 Java Socket编程的例子

在此示例中,客户端将首先写入内容到服务器,然后服务器将接收并打印文本。然后服务器将输出内容到客户端,客户端将接收并打印文本。

4.1 服务端

MyServer.java:

package cn.xnip;

/**
 * 小牛知识库网: https://www.xnip.cn
 */
/**
 *  Java Socket编程(服务端)
 */
import java.net.*;
import java.io.*;

class MyServer{

    public static void main(String args[])throws Exception{
        ServerSocket ss=new ServerSocket(3333);
        Socket s=ss.accept();
        DataInputStream din=new DataInputStream(s.getInputStream());
        DataOutputStream dout=new DataOutputStream(s.getOutputStream());
        BufferedReader br=new BufferedReader(new InputStreamReader(System.in));

        String str="",str2="";
        while(!str.equals("stop")){
            str=din.readUTF();
            System.out.println("client says: "+str);
            str2=br.readLine();
            dout.writeUTF(str2);
            dout.flush();
        }
        din.close();
        s.close();
        ss.close();
    }
}

4.2 客户端

MyClient.java:

package cn.xnip;

/**
 * 小牛知识库网: https://www.xnip.cn
 */
/**
 *  Java Socket编程(客户端)
 */
import java.net.*;
import java.io.*;

public class MyClient{

    public static void main(String args[])throws Exception{
        Socket s=new Socket("localhost",3333);
        DataInputStream din=new DataInputStream(s.getInputStream());
        DataOutputStream dout=new DataOutputStream(s.getOutputStream());
        BufferedReader br=new BufferedReader(new InputStreamReader(System.in));

        String str="",str2="";
        while(!str.equals("stop")){
            str=br.readLine();
            dout.writeUTF(str);
            dout.flush();
            str2=din.readUTF();
            System.out.println("Server says: "+str2);
        }

        dout.close();
        s.close();
    }
}

4.3 效果演示

1)先启动服务端,再启动客户端

2)再客户端输入内容,然后按回车

3)切换到服务端界面,可以看到客户端传递的内容

4)接着,在服务端再输入内容,按回车

5)切换到客户端,也可以看到服务端传递过来的内容

最后更新:

类似资料

  • 我正在使用Java套接字创建加密通信终端。我的问题是,当我通过“localhost”或我的计算机局域网地址连接时,程序连接完美,并按预期工作,但当我使用我的公共IP地址连接时,连接被拒绝,我得到 java.net.连接异常:连接超时:连接java.base/java.net.DualStackPlainSocketImpl.connect0(本地方法)在java.base/java.net.Dua

  • 我正在用htmlunit开发一个web cralwer,我已经添加了所有必需的超时,但我注意到,当我使用Java VisualVM进行线程转储时,当某个已爬网网站的服务器没有响应时,应用程序会挂起: 这真的很令人沮丧,因为我无法控制那些服务器。这个问题严重影响了我的应用程序的性能。 问题: 我如何解决这个问题? 有没有办法得到一个Java应用程序打开的套接字连接列表,并使用它来终止套接字,比如模拟

相关阅读

开发工具