简单Socket编程

@[TOC]简单Socket编程

1.一对一通信

//***************服务器代码(Server.java)
public class Server {
	public static void main(String[] args) {
		try {
			//在创建socket的时候指定连接相应IP跟端口的服务器
			ServerSocket serverSocket = new ServerSocket(8888);
			System.out.println("服务器已启动");
			//阻塞性方法,直到有客户端连接进来这个方法才会启动
			//accept方法能接受一个客户端的示例并保存到socket变量中
			Socket socket = serverSocket.accept();
			System.out.println("ip:"+socket.getLocalAddress()+",端口号:"+socket.getPort());
			
			//服务器接收信息,只能接受一行
			BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(socket.getInputStream()));
			String content = bufferedReader.readLine();//读取一行信息
			System.out.println(content);
			
			//服务器收到消息后在回应客户端,将对象的格式表示打印到文本输出流。
			PrintWriter printWriter = new PrintWriter(new OutputStreamWriter(socket.getOutputStream()));		
			printWriter.println("服务器 say hello");
			printWriter.flush();
		} catch (UnknownHostException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}
	}
	
// ************客户端(Client.java)
public class Client {
	public static void main(String[] args) {
		try {
			//定义一个指定端口的服务器,等待客户端的连接
			Socket socket = new Socket("localhost",8888);
		
			//通过PrintWriter中的println方法可以输出信息,PrintWriter只能输出字符流的信息
			//但是现在TCP的socket通信时基于字节流通讯的,所以要做字节流到字符流的转变,通过OutputStreamWriter
			PrintWriter printWriter = new PrintWriter(new OutputStreamWriter(socket.getOutputStream()));			
			printWriter.println("客户端 say hello");
			printWriter.flush();
			
			//客户端接收服务器的回应
			BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(socket.getInputStream()));
			String content=bufferedReader.readLine();//readLine()是一个阻塞性方法
			System.out.println(content);
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}
}

2.一对一循环通信

//*************服务器
public class Server1 {
	public static void main(String[] args) {
		try {
			//在创建socket的时候指定连接相应IP跟端口的服务器
			ServerSocket serverSocket = new ServerSocket(8888);
			System.out.println("服务器已启动");
			//阻塞性方法,直到有客户端连接进来这个方法才会启动
			//accept方法能接受一个客户端的示例并保存到socket变量中
			Socket socket = serverSocket.accept();
			System.out.println("ip:"+socket.getLocalAddress()+",端口号:"+socket.getPort());
			while(true){
				//服务器接收信息,只能接受一行
				BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(socket.getInputStream()));
				String content = bufferedReader.readLine();//读取一行信息
				System.out.println(content);
				
				//服务器收到消息后在回应客户端
				PrintWriter printWriter = new PrintWriter(new OutputStreamWriter(socket.getOutputStream()));	
				Scanner input = new Scanner(System.in);
				String str = input.nextLine();
				printWriter.println(str);
				printWriter.flush();
			}
		} catch (UnknownHostException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}
	}
}

//***************客户端
public class Client1 {
	public static void main(String[] args) {
		try {
			//定义一个指定端口的服务器,等待客户端的连接
			Socket socket = new Socket("localhost",8888);
		
			while(true){
				//通过PrintWriter中的println方法可以输出信息,PrintWriter只能输出字符流的信息
				//但是现在TCP的socket通信时基于字节流通讯的,所以要做字节流到字符流的转变,通过OutputStreamWriter
				PrintWriter printWriter = new PrintWriter(new OutputStreamWriter(socket.getOutputStream()));
			
				
				String str = new Scanner(System.in).nextLine();
				printWriter.println(str);
				printWriter.flush();
				
				//客户端接受服务器的回应
				BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(socket.getInputStream()));
				String content=bufferedReader.readLine();
				System.out.println(content);
			}
			
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}
}

3.一(服务器)对多(客户端)通信

//*************服务器
public class TServer {
	public static void main(String[] args) {
		try {
			//在创建socket的时候指定连接相应IP跟端口的服务器
			ServerSocket serverSocket = new ServerSocket(8888);
			System.out.println("服务器已启动");
			while (true) {
				//阻塞性方法,直到有客户端连接进来这个方法才会启动
				//accept方法能接受一个客户端的示例并保存到socket变量中
				Socket socket = serverSocket.accept();
				System.out.println("ip:"+socket.getLocalAddress()+",端口号:"+socket.getPort());
				Thread thread = new Thread(new ServerThread(socket));
				thread.start();
			}
			
		} catch (Exception e) {
			e.printStackTrace();
		} 
	}
}

//**************客户端
public class TClient {
	public static void main(String[] args) {
		try {
			//定义一个指定端口的服务器,等待客户端的连接
			Socket socket = new Socket("localhost",8888);
		
			while(true){
				//通过PrintWriter中的println方法可以输出信息,PrintWriter只能输出字符流的信息
				//但是现在TCP的socket通信时基于字节流通讯的,所以要做字节流到字符流的转变,通过OutputStreamWriter
				PrintWriter printWriter = new PrintWriter(new OutputStreamWriter(socket.getOutputStream()));
			
				
				String str = new Scanner(System.in).nextLine();
				printWriter.println(str);
				printWriter.flush();
				
				//客户端接受服务器的回应
				BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(socket.getInputStream()));
				String content=bufferedReader.readLine();
				System.out.println(content);
			}
			
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}
}

//***************线程
public class ServerThread implements Runnable{
	Socket socket;
	ServerThread(){
		
	}
	
	ServerThread(Socket socket){
		this.socket=socket;
	}
	@Override
	public void run() {
		// TODO Auto-generated method stub
		while(true){	
			try {
				//服务器接收信息,只能接受一行
				BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(socket.getInputStream()));
				String content = bufferedReader.readLine();//读取一行信息
				System.out.println(content);
				
				//服务器收到消息后在回应客户端
				PrintWriter printWriter = new PrintWriter(new OutputStreamWriter(socket.getOutputStream()));	
				Scanner input = new Scanner(System.in);
				String str = input.nextLine();
				printWriter.println(str);
				printWriter.flush();
			} catch (IOException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
			
		}
	}
}

一个输入输出流的介绍:https://blog.youkuaiyun.com/hanxue_wuhen/article/details/71985319

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值