TCPServer
ServerSocket ss = new ServerSocket(port);//创建以server运行的机器的locahost:port的服务器
/**
通过ss.accept(),阻塞式接收连接到服务器的socket,并创建一个线程来监听这个socket
*/
while(true){
Socket s = ss.accept();
new Thread(new ServerTask(s)).start();
}
ServerTask:调用Runable接口,
public Class ServerTask implements Runable{
private Socket s;
public ServerTask(Socket s){//将监听的socket赋给s
this.s = s;
}
@Override
public void run() {//监听socket的输入输出流
InputStream is = s.getInputStream();//socket->server
OutputStream os = s.getOutputStream();//server ->socket
Scanner sc = null;
PrinterWriter pw = null;
try {
sc = new Scanner(is);
pw = new PrinterWriter(os);
} catch (IOException e) {
e.printStackTrace();
}
while(true) {
String data = sc.nextLine();//阻塞式监听,是否接收到socket发来数据
System.out.println(data);
pw.println("xxxxxx");//接收到data后,再返回信息xxxxx给socket
pw.flush();
}
}
}
client
public class Client {
public static void main(String[] args) throws IOException{
Socket s = new Socket("127.0.0.1",8888);//创建socket,连接服务器,127.0.0.1:8888
new Thread(new WriteTask(s)).start();//创建线程对socket的写数据流监听 socket-》server
new Thread(new ReadTask(s)).start();//创建线程对socket的读数据流监听 server - 》socket
}
WriteTask
public class WriteTask implements Runnable {
private Socket s;
public WriteTask(Socket s){
this.s = s;
}
@Override
public void run() {
PrintWriter printWriter = null;
try {
printWriter = new PrintWriter(s.getOutputStream());
} catch (IOException e) {
e.printStackTrace();
}
Scanner sc = new Scanner(System.in);
while(true){//阻塞式判断终端是否有输入
String message = sc.nextLine();
printWriter.println(message);//socket->server
printWriter.flush();
}
}
ReadTask
InputStream is = s.getInputStream();
Scanner sc = new Scanner(is);
while(true){//阻塞式判断是否有输入
String message = sc.nextLine();//Server->socket
System.out.println(message);
}
总结:
1.服务器while true,阻塞接收socket,接到后,对socket专门创建线程进行监听,然后对socket接收请求,根据请求,服务器返回response
2.client 创建socket 1.client写数据,对server发送request,2.创建线程,对服务器的reponse进行接收
3.PrinterWriter是对outputStream的封装,
Scanner是对inputStream封装,只是很方便文字传输,但是要是传输图片或者object时 …….就会报错,所以,选择合适的流是很重要的
4.我上述的代码是简要版