版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
java基于TCP协议的Socket编程和通信在网络通讯中,第一次主动发起通讯的程序被称作客户端(Client)程序,简称客户端,而在第一次通讯中等待连接的程序被称作服务器端(Server)程序,简称服务器。一旦通讯建立,则客户端和服务器端完全一样,没有本质的区别。“请求-响应”模式:1.Socket类:发送TCP消息。2.ServerSocket类:创建服务器。套接字是一种进程间的数据交换机制。这些进程既可以在同一机器上,也可以在通过网络连接的不同机器上。换句话说,套接字起到通信端点的作用。单个套接字是一个端点,而一对套接字则构成一个双向通信信道,使非关联进程可以在本地或通过网络进行数据交换。一旦建立套接字连接,数据即可在相同或不同的系统中双向或单向发送,直到其中一个端点关闭连接。套接字与主机地址和端口地址相关联。主机地址就是客户端或服务器程序所在的主机的IP地址。端口地址是指客户端或服务器程序使用的主机的通信端口。在客户端和服务器中,分别创建独立的Socket,并通过Socket的属性,将两个Socket进行连接,这样,客户端和服务器通过套接字所建立的连接使用输入输出流进行通信。TCP/IP套接字是最可靠的双向流协议,使用TCP/IP可以发送任意数量的数据。实际上,套接字只是计算机上已编号的端口。如果发送方和接收方计算机确定好端口,他们就可以通信了。如图所示为客户端与服务器端的通信关系图:TCP/IP通信连接的简单过程:位于A计算机上的TCP/IP软件向B计算机发送包含端口号的消息,B计算机的TCP/IP软件接收该消息,并进行检查,查看是否有它知道的程序正在该端口上接收消息。如果有,他就将该消息交给这个程序。要使程序有效地运行,就必须有一个客户端和一个服务器。通过Socket的编程顺序:1.创建服务器ServerSocket,在创建时,定义ServerSocket的监听端口(在这个端口接收客户端发来的消息)。2.ServerSocket调用accept()方法,使之处于阻塞状态。3.创建客户端Socket,并设置服务器的IP及端口。4.客户端发出连接请求,建立连接。5.分别取得服务器和客户端Socket的InputStream和OutputStream。6.利用Socket和ServerSocket进行数据传输。7.关闭流及Socket。【示例12-7】TCP:单向通信Socket之服务器端importjava.io.BufferedWriter;importjava.io.IOException;importjava.io.OutputStreamWriter;import.ServerSocket;import.Socket;/***最简单的服务器端代码*@authorAdministrator*/publicclassBasicSocketServer{publicstaticvoidmain(String[]args){Socketsocket=null;BufferedWriterbw=null;try{//建立服务器端套接字:指定监听的接口ServerSocketserverSocket=newServerSocket(8888);System.out.println("服务端建立监听");//监听,等待客户端请求,并愿意接收连接socket=serverSocket.accept();//获取socket的输出流,并使用缓冲流进行包装bw=newBufferedWriter(newOutputStreamWriter(socket.getOutputStream()));//向客户端发送反馈信息bw.write("hhhh");}catch(IOExceptione){e.printStackTrace();}finally{//关闭流及socket连接if(bw!=null){try{bw.close();}catch(IOExceptione){e.printStackTrace();}}if(socket!=null){try{socket.close();}catch(IOExceptione){e.printStackTrace();}}}}}【示例12-8】TCP:单向通信Socket之客户端importjava.io.BufferedReader;importjava.io.IOException;importjava.io.InputStreamReader;import.InetAddress;import.Socket;/***最简单的Socket客户端*@authorAdministrator*/publicclassBasicSocketClient{publicstaticvoidmain(String[]args){Socketsocket=null;BufferedReaderbr=null;try{/**创建Scoket对象:指定要连接的服务器的IP和端口而不是自己机器的*端口。发送端口是随机的。*/socket=newSocket(InetAddress.getLocalHost(),8888);//获取scoket的输入流,并使用缓冲流进行包装br=newBufferedReader(newInputStreamReader(socket.getInputStream()));//接收服务器端发送的信息System.out.println(br.readLine());}catch(Exceptione){e.printStackTrace();}finally{//关闭流及socket连接if(br!=null){try{br.close();}catch(IOExceptione){e.printStackTrace();}}if(socket!=null){try{socket.close();}catch(IOExceptione){e.printStackTrace();}}}}}【示例12-9】TCP:双向通信Socket之服务器端importjava.io.BufferedReader;importjava.io.BufferedWriter;importjava.io.IOException;importjava.io.InputStreamReader;importjava.io.OutputStreamWriter;import.ServerSocket;import.Socket;publicclassServer{publicstaticvoidmain(String[]args){Socketsocket=null;BufferedReaderin=null;BufferedWriterout=null;BufferedReaderbr=null;try{//创建服务器端套接字:指定监听端口ServerSocketserver=newServerSocket(8888);//监听客户端的连接socket=server.accept();//获取socket的输入输出流接收和发送信息in=newBufferedReader(newInputStreamReader(socket.getInputStream()));out=newBufferedWriter(newOutputStreamWriter(socket.getOutputStream()));br=newBufferedReader(newInputStreamReader(System.in));while(true){//接收客户端发送的信息Stringstr=in.readLine();System.out.println("客户端说:"+str);Stringstr2="";//如果客户端发送的是“end”则终止连接if(str.equals("end")){break;}//否则,发送反馈信息str2=br.readLine();//读到为止,因此一定要输入换行符!out.write(str2+"");out.flush();}}catch(IOExceptione){e.printStackTrace();}finally{//关闭资源if(in!=null){try{in.close();}catch(IOExceptione){e.printStackTrace();}}if(out!=null){try{out.close();}catch(IOExceptione){e.printStackTrace();}}if(br!=null){try{br.close();}catch(IOExceptione){e.printStackTrace();}}if(socket!=null){try{socket.close();}catch(IOExceptione){e.printStackTrace();}}}}}【示例12-10】TCP:双向通信Socket之客户端importjava.io.BufferedReader;importjava.io.BufferedWriter;importjava.io.IOException;importjava.io.InputStreamReader;importjava.io.OutputStreamWriter;import.InetAddress;import.Socket;import.UnknownHostException;publicclassClient{publicstaticvoidmain(String[]args){Socketsocket=null;BufferedReaderin=null;BufferedWriterout=null;BufferedReaderwt=null;try{//创建Socket对象,指定服务器端的IP与端口socket=newSocket(InetAddress.getLocalHost(),8888);//获取scoket的输入输出流接收和发送信息in=newBufferedReader(newInputStreamReader(socket.getInputStream()));out=newBufferedWriter(newOutputStreamWriter(socket.getOutputStream()));wt=newBufferedReader(newInputStreamReader(System.in));while(true){//发送信息Stringstr=wt.readLine();out.write(str+"");out.flush();//如果输入的信息为“end”则终止连接if(str.equals("end")){break;}//否则,接收并输出服务器端信息System.out.println("服务器端说:"+in.readLine());}}catch(UnknownHostExceptione){e.printStackTrace();}catch(IOExceptione){e.printStackTrace();}finally{//关闭资源if(out!=null){try{out.close();}catch(IOExceptione){e.printStackTrace();}}if(in!=null){try{in.close();}catch(IOExceptione){e.printStackTrace();}}if(wt!=null){try{wt.close();}catch(IOExceptione){e.printStackTrace();}}if(socket!=null){try{socket.close();}catch(IOExceptione){e.printStackTrace();}}}}}执行结果如图所示菜鸟雷区运行时,要先启动服务器端,再启动客户端,才能得到正常的运行效果。但是,上面这个程序,必须按照安排好的顺序,服务器和客户端一问一答!不够灵活!!可以使用多线程实现更加灵活的双向通讯!!服务器端:一个线程专门发送消息,一个线程专门接收消息。客户端:一个线程专门发送消息,一个线程专门接收消息。【示例12-11】TCP:聊天室之服务器端importjava.io.BufferedReader;importjava.io.BufferedWriter;importjava.io.IOException;importjava.io.InputStreamReader;importjava.io.OutputStreamWriter;import.ServerSocket;import.Socket;publicclassChatServer{publicstaticvoidmain(String[]args){ServerSocketserver=null;Socketsocket=null;BufferedReaderin=null;try{server=newServerSocket(8888);socket=server.accept();//创建向客户端发送消息的线程,并启动newServerThread(socket).start();//main线程负责读取客户端发来的信息in=newBufferedReader(newInputStreamReader(socket.getInputStream()));while(true){Stringstr=in.readLine();System.out.println("客户端说:"+str);}}catch(IOExceptione){e.printStackTrace();}finally{try{if(in!=null){in.close();}}catch(IOExceptione){e.printStackTrace();}try{if(socket!=null){socket.close();}}catch(IOExceptione){e.printStackTrace();}}}}/***专门向客户端发送消息的线程**@authorAdministrator**/classServerThreadextendsThread{Socketss;BufferedWriterout;BufferedReaderbr;publicServerThread(Socketss){this.ss=ss;try{out=newBufferedWriter(newOutputStreamWriter(ss.getOutputStream()));br=newBufferedReader(newInputStreamReader(System.in));}catch(IOExceptione){e.printStackTrace();}}publicvoidrun(){try{while(true){Stringstr2=br.readLine();out.write(str2+"");out.flush();}}catch(IOExceptione){e.printStackTrace();}finally{try{if(out!=null){out.close();}}catch(IOExceptione){e.printStackTrace();}try{if(br!=null){br.close();}}catch(IOExceptione){e.printStackTrace();}}}}【示例12-12】TCP:聊天室之客户端importjava.io.BufferedReader;importjava.io.BufferedWriter;importjava.io.IOException;importjava.io.InputStreamReader;importjava.io.OutputStreamWriter;import.InetAddress;import.Socket;import.UnknownHostException;publicclassChatClient{publicstaticvoidmain(String[]args){Socketsocket=null;BufferedReaderin=null;try{socket=newSocket(InetAddress.getByName(""),8888);//创建向服务器端发送信息的线程,并启动newClientThread(socket).start();in=newBufferedReader(newInputStreamReader(socket.getInputStream()));//main线程负责接收服务器发来的信息while(true){System.out.println("服务器说:"+in.readLine());}}catch(UnknownHostExceptione){e.printStackTrace();}catch(IOExceptione){e.printStackTrace
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2026文科综评面试题及答案
- 2026物流服务面试题及答案
- 2026销售农产品面试题及答案
- 统编版语文九年级上册第一单元第6课《我看》教学设计+分层课堂训练
- 陶瓷(瓷砖)购销合同
- 2026年地热能开发合作协议合同(开发商与投资方)二篇
- 培训课件:海外充电桩市场分析
- 商务管理公司采购员述职报告
- 血液透析专科知识考试题库与答案
- 小学英语六年级小升初毕业模拟模拟试题测试卷(附答案)
- 2025年北京文旅部事业单位考试及答案
- 拉沙热培训课件
- 会展场馆安全培训课件
- 地下管线智能化监测施工方案
- 注塑模具浇口设计
- 高校计算机基础期末模拟试卷
- 单位员工餐厅整体保障服务方案
- 消防维保安全文明施工措施
- 备战2026年高考语文考试(新高考)易错点25 对“意义”与“用法”概念区分不清(语言文字运用之词语比较题)(原卷版)
- 医师三基考试急诊科卷附答案
- GB/T 9722-2023化学试剂气相色谱法通则
评论
0/150
提交评论