欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Java TCP Socket编程模型

程序员文章站 2022-04-03 09:17:51
...

1、socket是网络编程的说法,既然是网络编程那么就有服务器端和客户端,首先创建两个类,TCPSocket.java用于当做服务器端,TCPClient.java用于当做客户端,

2、首先编写服务器端,在Java中提供java.net.ServerSocket类来当做网络服务器,构造函数需要一个网络接       口,以6666为例,代码如下:

ServerSocket ss = new ServerSocket(6666);   

    此时,服务器端已经能够监听客户端请求。

3、编写客户端,在Java中提供java.net.Socket类来当做网络客户端,构造函数需要IP地址和网络接口,这里     的     接口应指明是哪个服务器的接口,在本例中,应该是上面服务器中指定的6666,代码如下:

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

    此时,客户端已经向服务器端发出连接请求。

4、客户端发出请求后,服务器端能够监听到,而要接受这个连接请求还要有如下代码:

Socket s = ss.accept();

    此时,服务器端和客户端已经能够连接上了。

 

服务器端完整代码:

import java.net.*;

public class TCPServer {
	public static void main(String[] args) throws Exception {
		ServerSocket ss = new ServerSocket(6666);
		Socket s = ss.accept();
		System.out.println("a client connect!");		
	}
}

 客户端完整代码:

import java.net.*;

public class TCPClient {
	public static void main(String[] args) throws Exception {
		Socket s = new Socket("127.0.0.1", 6666);
	}
}

 在运行本例时,应先运行服务器端,然后运行客户端。

当客户端发送一次连接请求后,服务器端接受到后,服务器就停止了,这不符合服务器接受多个用户的要求,所以更改服务器端代码:

import java.net.*;

public class TCPServer {
	public static void main(String[] args) throws Exception {
		ServerSocket ss = new ServerSocket(6666);
		while(true) {
			Socket s = ss.accept();
			System.out.println("a client connect!");
		}
		
	}
}

 accept()方法是阻塞式的方法,只要没有连接请求就会一直等下去,直到有客户端的连接请求发过来,接受之后经过while循环在等下一个请求,经过这个死循环就能实现接受多个用户的连接请求。

 

以下是用Java数据流由客户端向服务器端发送消息的超小型demo:

服务器端:

import java.net.*;
import java.io.*;

public class TCPServer {
	public static void main(String[] args) throws Exception {
		ServerSocket ss = new ServerSocket(6666);
		while(true) {
			Socket s = ss.accept();
			System.out.println("a client connect!");
			DataInputStream dis = new DataInputStream(s.getInputStream());
			System.out.println(dis.readUTF());
			dis.close();
			s.close();
		}
		
	}
}

 客户端:

import java.net.*;
import java.io.*;

public class TCPClient {
	public static void main(String[] args) throws Exception {
		Socket s = new Socket("127.0.0.1", 6666);
		OutputStream os = s.getOutputStream();
		DataOutputStream dos = new DataOutputStream(os);
		Thread.sleep(30000);
		dos.writeUTF("hello server!");
		dos.flush();
		dos.close();
		s.close();
	}
}