Java教程-Java套接字编程

Java套接字编程
Java套接字编程用于在不同JRE上运行的应用程序之间进行通信。
Java套接字编程可以是面向连接的或无连接的。
Socket类和ServerSocket类用于面向连接的套接字编程,DatagramSocket类和DatagramPacket类用于无连接的套接字编程。
套接字编程中的客户端必须知道两个信息:
- 服务器的IP地址
- 端口号
在这里,我们将进行单向的客户端和服务器通信。在这个应用程序中,客户端发送一条消息到服务器,服务器读取该消息并打印出来。这里使用了两个类:Socket类和ServerSocket类。Socket类用于客户端和服务器之间的通信。通过这个类,我们可以读取和写入消息。ServerSocket类用于服务器端。ServerSocket类的accept()方法会阻塞控制台,直到客户端连接。在客户端成功连接后,它返回服务器端的Socket实例。
Socket类
套接字简单地是两台机器之间通信的端点。Socket类可用于创建套接字。
重要方法
Method | Description |
---|---|
1) public InputStream getInputStream() | 返回附加到此套接字的 InputStream。 |
2) public OutputStream getOutputStream() | 返回附加到此套接字的 OutputStream。 |
3) public synchronized void close() | 关闭这个套接字 |
ServerSocket类
ServerSocket类可用于创建服务器套接字。这个对象用于与客户端建立通信。
重要方法
Method | Description |
---|---|
1) public Socket accept() | 返回套接字并在服务器和客户端之间建立连接。 |
2) public synchronized void close() | 关闭服务器套接字。 |
Java Socket编程示例
创建服务器:
要创建服务器应用程序,我们需要创建ServerSocket类的实例。在这里,我们使用6666端口号进行客户端和服务器之间的通信。您也可以选择任何其他端口号。accept()方法等待客户端连接。如果客户端连接到给定的端口号,它会返回一个Socket实例。
ServerSocket ss=new ServerSocket(6666);
Socket s=ss.accept();//建立连接并等待客户端
创建客户端:
要创建客户端应用程序,我们需要创建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();//建立连接
DataInputStream dis=new DataInputStream(s.getInputStream());
String str=(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 Socket编程示例(双向读写)
在这个示例中,客户端首先向服务器写入文本,然后服务器接收并打印该文本。然后服务器向客户端写入文本,客户端接收并打印该文本。步骤依此进行。
文件: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();
}}