Socket编程客户端和服务端通信过程

客户端与服务端通信的原理
Socket编程客户端和服务端通信过程_第1张图片
代码实现

一个服务器接收一个客户端的消息

客户端代码

package demo2;

import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.Socket;
public class Client {

	public static void main(String[] args) throws Exception, IOException {
		//通过socket对象向服务器发送请求
		Socket socket=new Socket("localhost",2198);
		//创建的socket对象是计算机客户端通讯的端点
		//该通讯的端点用于和服务器通讯
		InputStream is=socket.getInputStream();
		OutputStream os=socket.getOutputStream();
		//通过输出流将数据发送到通讯的另一端
		os.write("你好".getBytes());
		while(true){
			if(is.available()>0){
    			byte[] b=new byte[is.available()];
    			is.read(b);
    			System.out.println("服务端回复说"+new String(b));
		}
		}

	}
}


服务器代码

package demo2;

import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.Socket;

public class Server {
    public static void main(String[] args) throws IOException{
    	//创建服务器容器对象,需要监听计算机中的某一个接口
    	ServerSocket server=new ServerSocket(2198);
    	//执行accept方法等待客户端连接,该方法是线程阻塞的
    	//如果没有客户端发送请求,该方法会阻塞当前线程
    	//如果有客户端发送了请求,该方法会进入执行状态并返回一个Socket对象
    	//该Socket对象只能用于和发送请求这一客户端进行通讯
    	Socket socket=server.accept();
    	System.out.println("有客户端连接请求到服务器");
    	//取出输入流
    	InputStream is=socket.getInputStream();
    	OutputStream os=socket.getOutputStream();
    	//接受数据使用死循环来处理
    	while(true){
    		if(is.available()>0){
    			byte[] b=new byte[is.available()];
    			is.read(b);
    			System.out.println("客户端说"+new String(b));
    			//回复客户端
    			os.write("你也好".getBytes());
    		}
    	}
    	
    	
    }
}

一个服务器端可以接收多个客户端请求

客户端代码`

package demo3;

import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.Socket;
public class Client {

	public static void main(String[] args) throws IOException, Exception {
		Socket socket=new Socket("localhost",1233);
		//发送信息到服务器
		OutputStream os=socket.getOutputStream();
		InputStream is=socket.getInputStream();
        //发送一条信息
		os.write("你好我是客户端".getBytes());
		while(true){
			if(is.available()>0){
				byte[] b=new byte[(is.available())] ;
				is.read(b);
				System.out.println("服务器说"+new String(b));
			}
		}
	}

}

多线程代码

package demo3;

import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.Socket;

public class ServerReaderThread extends Thread {
    //定义一个Socket对象通过构造方法来赋值将main主线程的Socket对象传进来
	private Socket socket;
	public ServerReaderThread(Socket socket) {
		this.socket=socket;
	}

	@Override
	public void run() {
		//获取套接字中的输入流
		try {
			InputStream is=socket.getInputStream();
			OutputStream os=socket.getOutputStream();
			while(true){
				//如果输入流的信息长度大于零
				if(is.available()>0){
					//定义字节数组用于保存读取出的数据
					byte[] b=new byte[is.available()];
					is.read(b);//读
					System.out.println("客户端说"+new String(b));
					
					//回复 
					os.write("欢迎光临".getBytes());
					
					
				}
			}
		} catch (IOException e) {
			e.printStackTrace();
		}
	}
}

服务器端代码

package demo3;

import java.net.ServerSocket;
import java.net.Socket;

public class Server {

	public static void main(String[] args) throws Exception {
		//创建服务器套接字对象
		ServerSocket server=new ServerSocket(1233);
		while(true){
			System.out.println("服务器已开启正在等待客户端连接。。。。");
			//接受新的客户端请求
			Socket socket=server.accept();
			System.out.println("有新的客户端链接到了服务器");
			//开启一条新的线程用来接收该客户端发送的信息
			ServerReaderThread readThread=new ServerReaderThread(socket);
			//开始线程
			readThread.start();
		}
		

	}

}

你可能感兴趣的:(java)