Java Socket网络编程

在网络编程中,最基本的操作就是在两台机器之间建立点对点通信,Socket能够帮助我们实现这个功能。其实现原理为:

  • 在服务器端,使用ServerSocket监听指定的端口,端口可以随意指定(由于1024以下的端口通常属于保留端口,在一些操作系统中不可以随意使用,所以建议使用大于1024的端口),等待客户连接请求;在客户连接后,产生会话;在完成会话后,关闭连接。 
  • 在客户端,使用Socket对网络上某一个服务器的某一个端口发出连接请求,一旦连接成功,打开会话;会话完成后,关闭Socket。客户端不需要指定打开的端口,通常临时的、动态的分配一个1024以上的端口。

 

服务端代码

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

public class Server { 
	public static void main(String[] args) throws IOException{ 
		ServerSocket server=new ServerSocket(5678); 
		Socket client=server.accept(); 
		BufferedReader in=
			new BufferedReader(new InputStreamReader(client.getInputStream())); 
		PrintWriter out=new PrintWriter(client.getOutputStream()); 
		while(true){ 
			String str=in.readLine(); 
			System.out.println(str); 
			out.println("has receive...."); 
			out.flush(); 
			if(str.equals("end")) 
				break; 
		} 
		client.close(); 
	} 
}

 

服务器端使用ServerSocket监听端口,等待客户端连接。当建立连接后,在while循环中接收并显示客户端的消息,然后返回"has receive..."确认消息,直到客户端输入end为止。

 

 

客户端代码

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

public class Client{ 
	static Socket server; 

	public static void main(String[] args)throws Exception{ 
		server=new Socket(InetAddress.getLocalHost(),5678); 
		BufferedReader in=
			new BufferedReader(new InputStreamReader(server.getInputStream())); 
		PrintWriter out=new PrintWriter(server.getOutputStream()); 
		BufferedReader wt=new BufferedReader(new InputStreamReader(System.in)); 

		while(true){ 
			String str=wt.readLine(); 
			out.println(str); 
			out.flush(); 
			if(str.equals("end")){ 
				break; 
			} 
			System.out.println(in.readLine()); 
		} 
		server.close(); 
	} 
} 

 

客户端使用Socket建立与服务器端的连接。

 

 

以上是一对一的连接方式,如果存在多个客户端要访问同一个服务端的情况,该怎么办呢?

 

我们可以使用多线程来解决多个客户端的情况。其实现原理为:服务器端的主线程一直监听端口。当接收到一个客户端的请求时,创建一个线程来处理该请求,所有处理工作都由该线程实现,主线程继续监听端口。

 

 

服务端代码

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

public class Server extends Thread{ 
	private Socket client;
	
	public Server(Socket client) {
		this.client = client;
	}
	
	public void run() {
		try {
			BufferedReader in=
				new BufferedReader(new InputStreamReader(client.getInputStream())); 
			PrintWriter out=new PrintWriter(client.getOutputStream()); 
			while(true){ 
				String str=in.readLine(); 
				System.out.println(str); 
				out.println("has receive...."); 
				out.flush(); 
				if(str.equals("end")) 
					break; 
			} 
			client.close(); 
		} catch (IOException e) {
			e.printStackTrace();
		}
	}
	
	public static void main(String[] args) throws IOException{ 
		ServerSocket server=new ServerSocket(5678); 
		while (true) {
			Server s = new Server(server.accept());
			s.start();
		} 
	}
} 

 

这样,同一个服务器端可以为多个客户端服务。

你可能感兴趣的:(java,多线程,socket)