客户端与服务端通讯的原理
代码实现java
一个服务器接收一个客户端的消息
客户端代码web
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();
}
}
}
服务器端代码socket
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();
}
}
}