Java TCP Socket编程模型

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

 

猜你喜欢

转载自hejiawangjava.iteye.com/blog/2232273