JAVA笔记:Java网络编程(三)TCP程序设计

在Java中使用Socket完成TCP程序的开发,使用此类可以建立点对点的通讯连接。

在Socket的程序开发中,服务器端使用ServerSocket等待客户端的连接,对于Java的网络程序来讲,每一个客户端都使用一个Socket对象表示。

JAVA笔记:Java网络编程(三)TCP程序设计_第1张图片


客户端只要符合连接的通讯协议,服务器端都可以接收。

SeverSocket类

SeverSocket类的主要方法:
JAVA笔记:Java网络编程(三)TCP程序设计_第2张图片

Socket类

在服务器端每次运行时都需要使用accept()方法等待客户端连接,此方法执行之后服务器端将进入阻塞状态,直到客户端连接之后程序才向下执行,此方法的返回类型是Socket,每一个Socket都表示一个客户端对象。
Socket类的主要方法:
JAVA笔记:Java网络编程(三)TCP程序设计_第3张图片

在通讯时,服务器端可以进行输入和输出,同时客户端也可以进行输入和输出。

一个简单的C/S架构设计:
服务器端指定端口向客户端发送数据,客户端通过该端口接收数据。
服务器端:
package IP_demo;

import java.awt.print.Printable;
import java.io.IOException;
import java.io.PrintStream;
import java.net.ServerSocket;
import java.net.Socket;

public class HelloServer {

	public static void main(String[] args) throws IOException {
		ServerSocket server = null;
		Socket client = null;
		PrintStream out = null;
		server = new ServerSocket(8080);
		System.out.println("服务器运行,等待客户端连接···");
		client = server.accept();
		String str = "Helloworld";
		out = new PrintStream(client.getOutputStream());
		out.println(str);
		client.close();
		server.close();
	}

}

客户端:
package IP_demo;

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.net.Socket;

public class HelloClient {
	public static void main(String args[]) throws Exception {// 所有异常抛出
		Socket client = null;
		client = new Socket("localhost", 8080);
		BufferedReader buf = null;
		buf = new BufferedReader(new InputStreamReader(client.getInputStream()));
		String str = buf.readLine();
		System.out.println("服务器端输出内容:" + str);
		buf.close();
		client.close();
	}
};

C/S架构需要同时维护服务器端/客户端两套代码。
上述代码只能完成一次数据传递,下面的实例是网络编程通讯交互的一个经典案例,称为回应程序,客户端输入什么,服务器端就会回应收到的内容。
服务器端的设计:为了使客户端可以有多个用户同时使用,所以要加上多线程的操作:
import java.net.* ;
import java.io.* ;
public class EchoThreadServer{
	public static void main(String args[]) throws Exception {	// 所有异常抛出
		ServerSocket server = null ;		// 定义ServerSocket类
		Socket client = null ;	// 表示客 户端
		server = new ServerSocket(8888) ;	// 服务器在8888端口上监听
		boolean f = true ;	// 定义个标记位
		while(f){
			System.out.println("服务器运行,等待客户端连接。") ;
			client = server.accept() ;		// 得到连接,程序进入到阻塞状态
			new Thread(new EchoThread(client)).start() ;	// 每一个客户端表示一个线程
		}
		server.close() ;
	}
};

import java.net.* ;
import java.io.* ;
public class EchoThread implements Runnable{
	private Socket client = null ;
	public EchoThread(Socket client){
		this.client = client ;
	}
	public void run(){
		BufferedReader buf = null ;	// 接收输入流
		PrintStream out = null ;		// 打印流输出最方便
		try{
			out = new PrintStream(client.getOutputStream()) ;
			// 准备接收客户端的输入信息
			buf = new BufferedReader(new InputStreamReader(client.getInputStream())) ;
			boolean flag = true ;	// 标志位,表示可以一直接收并回应信息
			while(flag){
				String str = buf.readLine() ;		// 接收客户端发送的内容
				if(str==null||"".equals(str)){	// 表示没有内容
					flag = false ;	// 退出循环
				}else{
					if("bye".equals(str)){	// 如果输入的内容为bye表示结束
						flag = false ;
					}else{
						out.println("ECHO : " + str) ;	// 回应信息
					}
				}
			}
			client.close() ;
		}catch(Exception e){}
		
	}
};

客户端:
import java.net.* ;
import java.io.* ;
public class EchoClient{
	public static void main(String args[]) throws Exception {	// 所有异常抛出
		Socket client = null ;	// 表示客 户端
		client = new Socket("localhost",8888) ;
		BufferedReader buf = null ;	// 一次性接收完成
		PrintStream out = null ;	// 发送数据
		BufferedReader input = null ;	// 接收键盘数据
		input = new BufferedReader(new InputStreamReader(System.in)) ;
		buf = new BufferedReader(new InputStreamReader(client.getInputStream())) ;
		out = new PrintStream(client.getOutputStream()) ;
		boolean flag = true ;		// 定义标志位
		while(flag){
			System.out.print("输入信息:") ;
			String str = input.readLine() ;	// 接收键盘的输入信息
			out.println(str) ;
			if("bye".equals(str)){
				flag = false ;
			}else{
				String echo = buf.readLine() ;	// 接收返回结果
				System.out.println(echo) ;	// 输出回应信息
			}
		}
		buf.close() ;
		client.close() ;
	}
};










你可能感兴趣的:(JAVA笔记:Java网络编程(三)TCP程序设计)