一个客户端对一个服务器-交互(服务器端)
这里我们阴郁了线程,一个线程处理输入,一个线程处理接收
此服务器还是只能接受一个客户端的链接,
即服务器能读取键盘的输入还能接受客户端的键盘输入结果
此代码为服务器的代码,实现了既能接收键盘的输入流也能接收客户端的输入流。
应为有两个输入流,而readLine()函数也是个阻断没有输入流将会等待
如果
键盘.readLine();
客户端.readLine();
放在主程序中顺序的执行,意味着接到键盘输入后才能接收客户端输入,颠倒也会出现此问题。很不合理
于是我们使用了线程。
一个线程处理键盘输入流
一个线程处理客户端输入流
注意以下几点:
1.主函数的变量不能被线程类读取到,所以线程需要的变量需要在线程类里面定义
如:
BufferedReader in = new BufferedReader(new InputStreamReader(socket01.getInputStream()));
BufferedReader ins = new BufferedReader(new InputStreamReader(System.in));
PrintStream out=new PrintStream(socket01.getOutputStream());
本计划在主函数里定义,但是在线程类里用到in 、ins、out时提示没有定义,即读取不到主函数定义的变量
2.此程序把
Socket socket = ss.accept();//阻塞中,等待客户端介入
放到了主函数里面,线程子类需要PrintStream out=new PrintStream(socket01.getOutputStream());需要socket变量,
但是不能访问主函数,所以我们通过对线程类Syin和Soin的构造方法,来将参数socket传入到线程类里。
3.线程类Syin和Soin里都使用了死循环,反复的来调用readLine()来等待数据接收。
4.使用if来判断输入的数据是否是bb即byebye,从而来判断推出socket还是推出serversocket
package tcp;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.PrintStream;
import java.net.ServerSocket;
import java.net.Socket;
public class ThreadServer {
/**
* @param args
*/
static int portNo=3333;
public static void main(String[] args) throws Exception{
ServerSocket ss = new ServerSocket(portNo);
System.out.println("The Server is start"+ss);
//当有客户端连接的时候 ,标记客户端为socket01
Socket socket = ss.accept();//阻塞中,等待客户端接入
System.out.println("Client is connected"+socket);
//socket客户端过来的输入流,原本位置是这里,但是下边的线程子类不认in,所以把它调到了线程里
//BufferedReader in = new BufferedReader(new InputStreamReader(socket01.getInputStream()));
//来自服务器自身的键盘输入流,记录键盘操作,原本位置是这里,但是下边的线程子类不认ins,所以把它调到了线程里
//BufferedReader ins = new BufferedReader(new InputStreamReader(System.in));
//向客户端方向的输出流
//PrintStream out=new PrintStream(socket01.getOutputStream());
//实例化两个线程类
Syin sy = new Syin(socket);
Soin so = new Soin(socket);
sy.start();
so.start();
//socket.close();
//ss.close();
}
//定义两个线程类1.class Syin键盘流处理 2.class Soin socket客户端流
public static class Syin extends Thread {
Socket socket01 ;
public Syin(){
}
public Syin(Socket a){
this.socket01=a;
System.out.print("服务器键");
};
public void run() {
try{
BufferedReader ins = new BufferedReader(new InputStreamReader(System.in));
PrintStream outs=new PrintStream(socket01.getOutputStream());
while(true){
String str_sy = ins.readLine();
if(str_sy.equals("bb"))
break;
System.out.println("盘的输入内容是:"+str_sy);
}
socket01.close();
}catch (Exception e) {
e.printStackTrace();
}
};
}
//
public static class Soin extends Thread {
Socket socket01 ;
public Soin(){
}
public Soin(Socket b){
this.socket01=b;
System.out.print("来自客户");
};
public void run(){
try{
BufferedReader ins = new BufferedReader(new InputStreamReader(socket01.getInputStream()));
PrintStream outs=new PrintStream(socket01.getOutputStream());
while(true){
String str_sy = ins.readLine();
if(str_sy.equals("bb"))
break;
System.out.println("端的信息:"+str_sy);
}
socket01.close();
}catch (Exception e)
{
e.printStackTrace();
}
};
}
}