服务器的主要流程:
设置一个端口(ServerSocket)->客户端连接(.accept())->获得从客户端来的数据流->将该数据流到输出流中
客户端的主要流程:
设置bufferreader输入流->连接上端口->获得从服务器端来的数据流->将该数据流到输出流中
->将客户端从键盘输入的数据写入到输出流中给服务器
package com.mldn.servet;
import java.io.IOException;
import java.io.PrintStream;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.Scanner;
/**
* 实现服务器端
* 可以多线程
* @author lenovo
*
*/
public class EchoServr {
private static class ClientThread implements Runnable{
private Socket client=null;//描述每一个不同的客户端
private Scanner scan=null;
private PrintStream out=null;
private boolean flag=true;
public ClientThread(Socket client) throws Exception{
this.client=client;
this.scan=new Scanner(client.getInputStream());//获得从客户端哪里获得的数据到输入流中
//scan.useDelimiter("\n");
this.out=new PrintStream(client.getOutputStream());//将数据到输出流中
}
@Override
public void run() {
// TODO Auto-generated method stub
while(this.flag) {
if(scan.hasNext()) {//如果还有数据
String val=scan.next().trim();//一定要加个trim()来去掉换行符
if("byebye".equals(val)) {
out.println("byebyebye...");
this.flag=false;
}else {
out.println("[echo]"+val);
}
}
}
try {
client.close();
scan.close();
out.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
public static void main(String[] args) throws Exception {
ServerSocket server=new ServerSocket(1234);
System.out.println("等待客户端连接");
boolean flag=true;
while(flag) {
Socket client=server.accept();//有客户端连接
new Thread(new ClientThread(client)).start();
}
}
}
package com.mldn.servet;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.PrintStream;
import java.net.Socket;
import java.util.Scanner;
/**
*客户端的编写
* @author lenovo
*
*/
public class EchoClient {
private static final BufferedReader KEYBOARD_INPUT=new BufferedReader(new InputStreamReader(System.in));
public static void main(String[] args) throws Exception {
Socket client=new Socket("localhost",1234);
Scanner scan=new Scanner(client.getInputStream());
PrintStream out=new PrintStream(client.getOutputStream());
boolean flag=true;
while(flag) {
String input=getString("请输入要发送的内容:").trim();
out.println(input);//由于这里用到了换行符,因此后面的服务端要用到trim()
if(scan.hasNext()) {
System.out.println(scan.next());
}
if("byebye".equals(input)) {
flag=false;
}
}
scan.close();
client.close();
out.close();
}
public static String getString(String prompt) throws Exception {
System.out.println(prompt);
String str=KEYBOARD_INPUT.readLine();
return str;
}
}