上节回顾:在学习了Socket在建立客户端和服务器单项通讯中,分别创建独立的Socket,并通过Socket的属性。
那么如何将两个Socket进行连接,从而达到客户端和服务器之间建立输入输出流进行通信呢?在上节中我们已经讲到,TCP/IP套接字是最可靠的双向流协议,使用TCP/IP可以发送任意数量的数据。如果发送方和接收方计算机确定好端口,他们就可以通信了,其中的端口用套接字表示。
【示例1】客户端与服务器端双向交流的Socket之服务器端
import java.io.BufferedReader; import java.io.BufferedWriter; import java.io.InputStreamReader; import java.io.OutputStreamWriter; import java.net.ServerSocket; import java.net.Socket; public class Server { public static void main(String[] args) throws Exception { ServerSocket server=new ServerSocket(8888); Socket socket=server.accept(); BufferedReader in=new BufferedReader(new InputStreamReader(socket.getInputStream())); BufferedWriter out=new BufferedWriter(new OutputStreamWriter(socket.getOutputStream())); BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); while(true){ String str=in.readLine(); System.out.println("客户端说:"+str); String str2 = ""; str2 = br.readLine(); //读到\n为止,因此一定要输入换行符! out.write(str2+"\n"); out.flush(); if(str.equals("end")) break; }
in.close(); out.close(); socket.close(); } } |
【示例2】客户端与服务器端双向交流的Socket之客户端
import java.io.BufferedReader; import java.io.BufferedWriter; import java.io.IOException; import java.io.InputStreamReader; import java.io.OutputStreamWriter; import java.net.InetAddress; import java.net.Socket; import java.net.UnknownHostException;
public class Client { static Socket server;
public static void main(String[] args) { try { server = new Socket(InetAddress.getLocalHost(), 8888); BufferedReader in = new BufferedReader(new InputStreamReader( server.getInputStream())); BufferedWriter out = new BufferedWriter(new OutputStreamWriter( server.getOutputStream())); BufferedReader wt = new BufferedReader(new InputStreamReader( System.in));
while (true) { String str = wt.readLine(); out.write(str + "\n"); out.flush(); if (str.equals("end")) { break; } System.out.println("服务器发说:" + in.readLine()); }
out.close(); in.close(); wt.close(); server.close();
} catch (UnknownHostException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); }
} } |
学习以上程序后,会发现我们必须按照安排好的顺序,服务器和客户端一问一答!不够灵活!!那么如何用多线程来实现更加灵活的双向通讯呢?下节我们继续~
「全栈Java笔记」是一部能帮大家从零到一成长为全栈Java工程师系列笔记。笔者江湖人称 Mr. G,10年Java研发经验,曾在神州数码、航天院某所研发中心从事软件设计及研发工作,从小白逐渐做到工程师、高级工程师、架构师。精通Java平台软件开发,精通JAVAEE,熟悉各种流行开发框架。
笔记包含从浅入深的六大部分:
A-Java入门阶段
B-数据库从入门到精通
C-手刃移动前端和Web前端
D-J2EE从了解到实战
E-Java高级框架精解
F-Linux和Hadoop
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。