📜  Java socket编程

📅  最后修改于: 2020-09-27 08:26:17             🧑  作者: Mango

Java socket编程

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

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

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

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

  • 服务器的IP地址,以及
  • 端口号。

在这里,我们将进行单向客户端和服务器通信。在此应用程序中,客户端将消息发送到服务器,服务器读取消息并打印。在这里,使用了两个类:Socket和ServerSocket。 Socket类用于通信客户端和服务器。通过此类,我们可以读写消息。 ServerSocket类在服务器端使用。 ServerSocket类的accept()方法将阻止控制台,直到客户端连接为止。客户端成功连接后,它将在服务器端返回Socket的实例。

插座类

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

重要方法

Method Description
1) public InputStream getInputStream() returns the InputStream attached with this socket.
2) public OutputStream getOutputStream() returns the OutputStream attached with this socket.
3) public synchronized void close() closes this socket

ServerSocket类

ServerSocket类可用于创建服务器套接字。该对象用于与客户端建立通信。

重要方法

Method Description
1) public Socket accept() returns the socket and establish a connection between server and client.
2) public synchronized void close() closes the server socket.

Java套接字编程示例

创建服务器:

要创建服务器应用程序,我们需要创建ServerSocket类的实例。在这里,我们使用6666端口号进行客户端和服务器之间的通信。您也可以选择其他任何端口号。 accept()方法等待客户端。如果客户端使用给定的端口号进行连接,则它将返回Socket的实例。

ServerSocket ss=new ServerSocket(6666);
Socket s=ss.accept();//establishes connection and waits for the client 

创建客户端:

要创建客户端应用程序,我们需要创建Socket类的实例。在这里,我们需要传递服务器的IP地址或主机名以及端口号。在这里,我们使用“ localhost”,因为我们的服务器在同一系统上运行。

Socket s=new Socket("localhost",6666);

让我们看一个简单的Java套接字编程,其中客户端发送文本,服务器接收并打印文本。

文件:MyServer.java

import java.io.*;
import java.net.*;
public class MyServer {
public static void main(String[] args){
try{
ServerSocket ss=new ServerSocket(6666);
Socket s=ss.accept();//establishes connection 
DataInputStream dis=new DataInputStream(s.getInputStream());
Stringstr=(String)dis.readUTF();
System.out.println("message= "+str);
ss.close();
}catch(Exception e){System.out.println(e);}
}
}

文件:MyClient.java

import java.io.*;
import java.net.*;
public class MyClient {
public static void main(String[] args) {
try{
Socket s=new Socket("localhost",6666);
DataOutputStream dout=new DataOutputStream(s.getOutputStream());
dout.writeUTF("Hello Server");
dout.flush();
dout.close();
s.close();
}catch(Exception e){System.out.println(e);}
}
}

要执行此程序,请打开两个命令提示符,并在每个命令提示符处执行每个程序,如下图所示。

运行客户端应用程序后,服务器控制台上将显示一条消息。

Java套接字编程示例(双方读写)

在此示例中,客户端将首先写入服务器,然后服务器将接收并打印文本。然后,服务器将写入客户端,客户端将接收并打印文本。步骤继续。

文件:MyServer.java

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();
}}

文件:MyClient.java

import java.net.*;
import java.io.*;
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();
}}