Java中的TCP编程
TCP/IP通信协议是一种可靠的网络协议,能够在通信的两端各建立一个Socket,从而在通信的两端之间形成网络虚拟链路。一旦建立了虚拟的网络链路,两端的程序就可以通过虚拟链路进行通信。
Socket
在客户端可以使用Socket的构造器来连接到指定服务器,在Socket中可以使用如下两个构造函数。
- Socket( InetAddress/String remoteAddress, int port):创建连接到指定远程主机、远程端口的Socket,该构造器没有指定本地地址、本地端口,默认使用本地主机的默认IP地址,默认使用系统动态指定的IP地址
- Socket( InetAddress/String remoteAddress, int port, InetAddress localAddr,int localPort):创建连接到指定远程主机、远程端口的Socket,并指定本地IP地址和本地端口号,适用于本地主机有多个IP地址的情形
ServerSocket
服务器通过ServerSocket来进行监听,提供了如下的构造函数来创建对象。
- ServerSocket( int port ):用指定的端口port来创建一个ServerSocket
- ServerSocket( int port, int backlog ):增加一个用来改变连接队列长度的参数backlog
- ServerSocket( int port, int backlog, InetAddress localAddr ) 当存在多个IP地址的情况下,允许通过localAddr这个参数来指定将ServerSocket绑定到指定的IP地址
当连接到指定服务器,让服务器端的ServerSocket的accept()方法执行,于是服务器端和客户端就产生一对互相连接的Socket。
客户端实例
Client.java
import java.net.*;
import java.io.*;
public class Client {
public static void main(String[] args){
String severName="localhost";
int port =30000;
try{
//客户端请求连接severName主机port端口建立TCP连接
System.out.println("连接到主机"+severName+" 端口号:"+port);
Socket client=new Socket(severName,port);
//获取输出流,用来发送数据给服务器
System.out.println("远程主机地址:"+client.getRemoteSocketAddress());
OutputStream outToSever=client.getOutputStream();
DataOutputStream out=new DataOutputStream(outToSever);
out.writeUTF("hello,。。。。。");
//获取输入流,用来接收服务器的数据
InputStream inFromSever=client.getInputStream();
DataInputStream in=new DataInputStream(inFromSever);
System.out.println("服务器响应:"+in.readUTF());
client.close();
}catch(Exception e){
e.printStackTrace();
}
}
}
服务器端实例
Server.java
import java.net.*;
import java.io.*;
public class Server extends Thread {
private ServerSocket serverSocket;
public Server(int port) throws IOException{
serverSocket=new ServerSocket(port);
serverSocket.setSoTimeout(10000);
}
public void run(){
while(true){
try{
//通过相应的连接端口,等待连接
System.out.println("等待远程连接,端口号为:"+serverSocket.getLocalPort());
Socket server=serverSocket.accept();
System.out.println("远程主机地址:" + server.getRemoteSocketAddress());
//获取输入流,用来接收客户端的数据
DataInputStream in = new DataInputStream(server.getInputStream());
System.out.println("客服端响应:"+in.readUTF());
//获取输出流,用来发送数据给客服端
DataOutputStream out = new DataOutputStream(server.getOutputStream());
out.writeUTF("谢谢连接我:" + server.getLocalSocketAddress() + "\nGoodbye!");
server.close();
}catch(SocketTimeoutException s){
System.out.println("Socket timed out!");
break;
}catch(IOException e){
e.printStackTrace();
break;
}
}
}
public static void main(String[] args){
int port=30000;
try{
Thread t=new Server(port);
t.run();
}catch(IOException e){
e.printStackTrace();
}
}
}
先运行Server.java,然后运行Client.java
服务器端的运行结果
等待远程连接,端口号为:30000
远程主机地址:/127.0.0.1:60776
客服端响应:hello,。。。。。
等待远程连接,端口号为:30000
Socket timed out!
客户端的运行结果
连接到主机localhost 端口号:30000
远程主机地址:localhost/127.0.0.1:30000
服务器响应:谢谢连接我:/127.0.0.1:30000
Goodbye!