Echo是一个经典的程序开发模型,本程序的意义在于:客户端随意输入信息并且将信息发送给服务器端,服务器端接收后前面加上一个"ECHO"的标记返回。
本程序设计如下:
由于需要采用多次输入的形式,所以不能够每次连接后立刻关闭服务端
可以设置一个字符串,如果输入了byebye,那么才表示结束本次的操作。
范例:实现服务器端
public class TestDemo{
public static void main(String[] args) throws Exception{
ServerSocket server=new ServerSocket(9999);
System.out.println("等待客户端连接=====");
Socket client=server.accept();//等待客户端连接
//客户端输入数据(InputStream) 以及向客户端输出数据(OutputStream)
Scanner scanner=new Scanner(client.getInputStream());
PrintStream out=new PrintStream(client.getOutputStream());
boolean flag=true;
while(flag){
if(scanner.hasNext()){
String str=scanner.next().trim();//得到客户端信息 trim方法去掉输入字符串空格
if(str.equalsIgnoreCase("byebye")){//程序要结束
out.println("bye~~~~~~~~~~~~~~~");
flag=false;
}else{//一下子回应输入信息
out.println("ECHO:"+str);
}
}
}
scanner.close();
out.close();
client.close();
server.close();
}
}
范例:客户端:
public class Member {
public static void main(String[] args) throws Exception{
Socket client=new Socket("localhost",9999);//连接服务器 主机号加端口号
Scanner input=new Scanner(System.in);//取得键盘输入对象
Scanner scan=new Scanner(client.getInputStream());//取得输入流
PrintStream out=new PrintStream(client.getOutputStream());//取得输出流
input.useDelimiter("\n");//设置分隔符
scan.useDelimiter("\n");
boolean flag=true;
//这里对于客户端的输入流input是键盘 scan是服务器 输出流是服务器端
while(flag){
System.out.println("请输入要发送数据");
if(input.hasNext()){//键盘输入流
String str=input.next().trim();//取得键盘输入对象
out.println(str);//键盘输入数据通过客户端给服务器端
if(str.equalsIgnoreCase("byebye")){
flag=false;
}
//服务器输入流 对服务器一下子返回的信息作出响应
if(scan.hasNext()){
System.out.println(scan.next());
}
}
}
input.close();
scan.close();
out.close();
client.close();
}
}
此时就实现了一个最简单的服务器端和客户端通讯。
此时的程序只能够连接一个客户端,而不能连接其它客户端,因为所有的程序都在主线程中开发,所以说此时的程序是单线程的网络应用,所以为了能够让一个服务器端同时处理多个客户端的操作,我们使用多线程操作,把每一个连接到服务器端的客户都作为一个独立的线程对象保留:
范例:修改服务器端
class EchoThread implements Runnable{
private Socket client;
public EchoThread(Socket client){
this.client=client;
}
@Override
public void run() {
try{
//客户端输入数据(InputStream) 以及向客户端输出数据(OutputStream)
Scanner scanner=new Scanner(client.getInputStream());
PrintStream out=new PrintStream(client.getOutputStream());
boolean flag=true;
while(flag){
if(scanner.hasNext()){
String str=scanner.next().trim();//得到客户端信息 trim方法去掉输入字符串空格
if(str.equalsIgnoreCase("byebye")){//程序要结束
out.println("bye~~~~~~~~~~~~~~~");
flag=false;
}else{//一下子回应输入信息
out.println("ECHO:"+str);
}
}
}
scanner.close();
out.close();
client.close();
}catch(Exception e){
e.printStackTrace();
}
}
}
public class TestDemo{
public static void main(String[] args) throws Exception{
ServerSocket server=new ServerSocket(9999);
System.out.println("等待客户端连接=====");
boolean flag=true;
while(true){//每一个客户端连接都开启一个多线程
Socket client=server.accept();//等待客户端连接
new Thread(new EchoThread(client)).start();//多线程
}
server.close();
}
}
服务器开发的基础要素:
网络支持类,IO,多线程
总结
对于网络编程,我们很少会去进行其实际的开发,了解基本概念就可以了。
网友评论