1 如何实现网络中的主机相互通信

一定的规则,有两套参考模型

(1)osi参考模型,过于理想化,未能在互联网上推行

osi有七层

(2)tcp/ip参考模型,有四层,各层之间通过不同的网络协议传输数据。

应用层: http协议

传输层:TCP UDP协议

网络层:IP协议

物理+数据链路层:Link协议

(3)截图?

2   通信要素一 定位计算机

(1)IP定位互联网上唯一计算机

(2)端口号定位计算机上的应用

(3)定位IP地址和端口号,java类InetAddress可以创建IP类

要素二 在按照协议传输

传输层有两个重要的协议,TCP/IP协议  UDP协议

TCP协议:三次握手,客户端服务端,可靠,大数据,效率低

(1)使用以前,先建立TCP链接,形成通道

(2)传输前采取三次握手,是可靠的,A给B传输,A先给B发信息,B回复A,A开始传输。

(3)TCP协议通信有两个进程,客户端,服务端

(4)可进行大数据传输

(5)传输完毕,需要释放已将建立的链接,效率低。

UDP协议:

(1)将数据、源地址、目的地址 封装成数据包,不需要建立链接

(2)每个数据包限制在64K以内

(3)不可靠

(4)无需释放资源,速度快

3、SOCKET套接字

(1)socket是两台机器间通信的端点

(2)socket允许把网络链接当成一个流,数据在两个socket之间通过IO传输

(3)主动发起请求的是客户端,等待请求的是服务端

4、(1)例1,客户端发送请求,服务端接收打印到控制台

  1. package com.socket.test;
  2.  
  3. import java.io.IOException;
  4. import java.io.InputStream;
  5. import java.io.OutputStream;
  6. import java.net.InetAddress;
  7. import java.net.ServerSocket;
  8. import java.net.Socket;
  9. import java.net.UnknownHostException;
  10.  
  11. import org.junit.Test;
  12.  
  13. //客户端给服务端发送信息,服务端输出信息到控制台上
  14. public class TCPTest {
  15.  
  16. //客户端
  17. @Test
  18. public void client(){
  19. //1、创建Socket套接字
  20. Socket socket = null;
  21. //2、获取输出流
  22. OutputStream os = null;
  23. try {
  24. socket = new Socket(InetAddress.getByName("127.0.0.1"),8090);
  25. os = socket.getOutputStream();
  26. //3、向服务端写消息
  27. os.write("I am Client".getBytes());
  28. } catch (UnknownHostException e) {
  29. e.printStackTrace();
  30. } catch (IOException e) {
  31. e.printStackTrace();
  32. }finally{
  33. //4、关闭流,套接字
  34. if(socket != null){
  35. try {
  36. socket.close();
  37. } catch (IOException e) {
  38. // TODO Auto-generated catch block
  39. e.printStackTrace();
  40. }
  41. }
  42. if(os != null){
  43. try {
  44. socket.close();
  45. } catch (IOException e) {
  46. // TODO Auto-generated catch block
  47. e.printStackTrace();
  48. }
  49. }
  50. }
  51. }
  52.  
  53. @Test
  54. public void server(){
  55. Socket socket = null;
  56. InputStream is = null;
  57. ServerSocket ss = null;
  58. try {
  59. //1、创建ServerSocket对象,指定端口号
  60. ss = new ServerSocket(8090);
  61.  
  62. //2、接收socket
  63. socket = ss.accept();
  64. //3、获取输入流
  65. is = socket.getInputStream();
  66. //4、读取
  67. byte[] b = new byte[20];
  68. int len;
  69. while((len = is.read(b)) != -1){
  70. String str = new String(b,0,len);
  71. System.out.print(socket.getInetAddress().getHostAddress()+"says"+str);
  72. }
  73. System.out.println("123");
  74. } catch (IOException e) {
  75. // TODO Auto-generated catch block
  76. e.printStackTrace();
  77. }finally{
  78. if(socket != null ){
  79. try {
  80. socket.close();
  81. } catch (IOException e) {
  82. // TODO Auto-generated catch block
  83. e.printStackTrace();
  84. }
  85. }
  86. if(ss != null){
  87. try {
  88. ss.close();
  89. } catch (IOException e) {
  90. // TODO Auto-generated catch block
  91. e.printStackTrace();
  92. }
  93. }
  94. if(is != null){
  95. try {
  96. is.close();
  97. } catch (IOException e) {
  98. // TODO Auto-generated catch block
  99. e.printStackTrace();
  100. }
  101. }
  102. }
  103.  
  104. }
  105. }

(2)例2,客户端向务务端发送请求,服务端应答

  1. package com.socket.test;
  2.  
  3. import java.io.IOException;
  4. import java.io.InputStream;
  5. import java.io.OutputStream;
  6. import java.net.InetAddress;
  7. import java.net.ServerSocket;
  8. import java.net.Socket;
  9. import java.net.UnknownHostException;
  10.  
  11. import org.junit.Test;
  12.  
  13. /*
  14. * 向服务端写消息,服务端收到消息后返回消息
  15. */
  16. public class TCPTest1 {
  17.  
  18. @Test
  19. public void client(){
  20. Socket socket = null;
  21. OutputStream os = null;
  22. InputStream is = null;
  23. try {
  24. InetAddress inetObj = InetAddress.getByName("127.0.0.1");
  25. socket = new Socket(inetObj,8090);
  26. os = socket.getOutputStream();
  27.  
  28. os.write(("Hello I am " + inetObj.getHostName()).getBytes());
  29. os.flush();
  30. //注意,这里的os不关闭,服务端对应的is.read()方法就会一直处于阻塞状态,无法往下执行,
  31. //所以我们要告诉服务端的inputstream,我这里不会再写了,服务端的is就不会再等待,
  32. //执行此方法,显示告诉服务器,客户端发送完毕
  33. socket.shutdownOutput();
  34. is = socket.getInputStream();
  35. byte[] b = new byte[20];
  36. int len;
  37. while((len = is.read(b)) != -1){
  38. System.out.println("收到服务状的消息"+new String(b,0,len));
  39. }
  40. } catch (UnknownHostException e) {
  41. e.printStackTrace();
  42. } catch (IOException e) {
  43. e.printStackTrace();
  44. }finally{
  45. if( os!= null){
  46. try {
  47. os.close();
  48. } catch (IOException e) {
  49. e.printStackTrace();
  50. }
  51. }
  52. if( socket!= null){
  53. try {
  54. socket.close();
  55. } catch (IOException e) {
  56. e.printStackTrace();
  57. }
  58. }
  59.  
  60. if(is != null){
  61. try {
  62. is.close();
  63. } catch (IOException e) {
  64. e.printStackTrace();
  65. }
  66. }
  67. }
  68.  
  69. }
  70.  
  71. @Test
  72. public void server() {
  73. ServerSocket serverSocket = null;
  74. Socket socket = null;
  75.  
  76. try {
  77. serverSocket = new ServerSocket(8090);
  78. while(true){
  79. socket = serverSocket.accept();
  80. handleSocket(socket);
  81. }
  82. } catch (IOException e) {
  83. e.printStackTrace();
  84. }finally{
  85. if(serverSocket != null){
  86. try {
  87. serverSocket.close();
  88. } catch (IOException e) {
  89. // TODO Auto-generated catch block
  90. e.printStackTrace();
  91. }
  92. }
  93. }
  94. }
  95.  
  96. public void handleSocket(Socket socket){
  97. InputStream is = null;
  98. OutputStream os = null;
  99. try {
  100. is = socket.getInputStream();
  101. byte[] b = new byte[20];
  102. int len;
  103. StringBuffer sbr = new StringBuffer();
  104. while((len = is.read(b)) != -1){
  105. sbr.append(new String(b,0,len));
  106. }
  107. System.out.println("客户端说:"+sbr.toString());
  108. os = socket.getOutputStream();
  109. os.write(sbr.toString().toUpperCase().getBytes());
  110. } catch (IOException e) {
  111. e.printStackTrace();
  112. }finally{
  113. if(os != null){
  114. try {
  115. os.close();
  116. } catch (IOException e) {
  117. // TODO Auto-generated catch block
  118. e.printStackTrace();
  119. }
  120. }
  121. if(is != null){
  122. try {
  123. is.close();
  124. } catch (IOException e) {
  125. // TODO Auto-generated catch block
  126. e.printStackTrace();
  127. }
  128. }
  129. if(socket != null){
  130. try {
  131. socket.close();
  132. } catch (IOException e) {
  133. // TODO Auto-generated catch block
  134. e.printStackTrace();
  135. }
  136. }
  137. }
  138.  
  139. }
  140. }

(3)客户端发送文件到服务端,服务端接收完毕后,告诉客户端 ,接收完毕

  1. package com.socket.test;
  2.  
  3. import java.io.File;
  4. import java.io.FileInputStream;
  5. import java.io.FileNotFoundException;
  6. import java.io.FileOutputStream;
  7. import java.io.IOException;
  8. import java.io.InputStream;
  9. import java.io.OutputStream;
  10. import java.net.InetAddress;
  11. import java.net.ServerSocket;
  12. import java.net.Socket;
  13. import java.net.UnknownHostException;
  14.  
  15. import org.junit.Test;
  16.  
  17. //客户端发送文件给服务端
  18. public class TcpTest2 {
  19.  
  20. @Test
  21. public void fileClient() {
  22. // 1、创建socket对象
  23. Socket socket = null;
  24. // 2、获取输出流
  25. OutputStream os = null;
  26. // 3、先读,把本地文件读入输入流
  27. FileInputStream fis = null;
  28.  
  29. InputStream is = null;
  30. try {
  31. socket = new Socket(InetAddress.getByName("127.0.0.1"), 8090);
  32. os = socket.getOutputStream();
  33. fis = new FileInputStream(new File("d://env.conf"));
  34. byte[] b = new byte[64];
  35. int len;
  36. while ((len = fis.read(b)) != -1) {
  37. // 4、往外写
  38. os.write(b, 0, len);
  39. }
  40. // 5、告诉服务器写完了
  41. socket.shutdownOutput();
  42. // 6、读取从服务器返回的消息
  43. is = socket.getInputStream();
  44. byte[] b1 = new byte[20];
  45. int len1;
  46. while ((len1 = is.read(b1)) != -1) {
  47. System.out.print(new String(b1, 0, len1));
  48. }
  49. } catch (UnknownHostException e) {
  50. e.printStackTrace();
  51. } catch (FileNotFoundException e) {
  52. e.printStackTrace();
  53. } catch (IOException e) {
  54. e.printStackTrace();
  55. } finally {
  56. if (socket != null) {
  57. try {
  58. socket.close();
  59. } catch (IOException e) {
  60. // TODO Auto-generated catch block
  61. e.printStackTrace();
  62. }
  63. }
  64. if (os != null) {
  65. try {
  66. os.close();
  67. } catch (IOException e) {
  68. // TODO Auto-generated catch block
  69. e.printStackTrace();
  70. }
  71. }
  72. if (fis != null) {
  73. try {
  74. fis.close();
  75. } catch (IOException e) {
  76. // TODO Auto-generated catch block
  77. e.printStackTrace();
  78. }
  79. }
  80. if (is != null) {
  81. try {
  82. is.close();
  83. } catch (IOException e) {
  84. // TODO Auto-generated catch block
  85. e.printStackTrace();
  86. }
  87. }
  88.  
  89. }
  90.  
  91. }
  92.  
  93. @Test
  94. public void fileServer() {
  95. ServerSocket ss = null;
  96. try {
  97. ss = new ServerSocket(8090);
  98. while(true){
  99. Socket socket = ss.accept();
  100. handleClient(socket);
  101. }
  102. } catch (IOException e) {
  103. e.printStackTrace();
  104. }finally{
  105. try {
  106. if(ss != null){
  107. ss.close();
  108. }
  109. } catch (IOException e) {
  110. e.printStackTrace();
  111. }
  112. }
  113.  
  114. }
  115.  
  116. public void handleClient(Socket socket){
  117. //1、获取输入流
  118. InputStream is = null;
  119. //2、创建fileoutputStream对象
  120. FileOutputStream fos = null;
  121.  
  122. OutputStream os = null;
  123. try {
  124. is = socket.getInputStream();
  125. fos = new FileOutputStream(new File("d://env1.conf"));
  126. //3、读取服务器发来的字节
  127. int len;
  128. byte b [] = new byte[64];
  129. while((len = is.read(b)) != -1){
  130. fos.write(b, 0, len);
  131. }
  132. fos.flush();
  133. //4、写文件完毕,获取socket的输出流给客户端返回消息
  134. os = socket.getOutputStream();
  135. os.write("Accepted Over !".getBytes());
  136. os.flush();
  137. } catch (FileNotFoundException e) {
  138. // TODO Auto-generated catch block
  139. e.printStackTrace();
  140. } catch (IOException e) {
  141. // TODO Auto-generated catch block
  142. e.printStackTrace();
  143. }finally{
  144.  
  145. if (socket != null) {
  146. try {
  147. socket.close();
  148. } catch (IOException e) {
  149. // TODO Auto-generated catch block
  150. e.printStackTrace();
  151. }
  152. }
  153. if (os != null) {
  154. try {
  155. os.close();
  156. } catch (IOException e) {
  157. // TODO Auto-generated catch block
  158. e.printStackTrace();
  159. }
  160. }
  161. if (fos != null) {
  162. try {
  163. fos.close();
  164. } catch (IOException e) {
  165. // TODO Auto-generated catch block
  166. e.printStackTrace();
  167. }
  168. }
  169. if (is != null) {
  170. try {
  171. is.close();
  172. } catch (IOException e) {
  173. // TODO Auto-generated catch block
  174. e.printStackTrace();
  175. }
  176. }
  177.  
  178. }
  179.  
  180. }
  181. }

5、socket通信原理

客户端,创建出一个socket对象时(创建InetAddress对象时,传入的ip是服务器的ip),服务端也接受到一个socket对象

通过socket可以获取输入流和输出流

,客户端通过socket对象的输出流往服务器端写数据,

服务器端通过socket对象的输入流读数据

服务器服务端的通信,实际是sockey里面IO流的通信。

要注意的是,Inputsream的read方法,和ServetSocket的accept方法是阻塞方法。

6、聊天室的做法

1)客户端发送自己的名字a,消息,送达人的名字b,拼接成一个字符串。

2)服务端,接到a的请求,截取字符串,把a和a对应的socket对象放到map里面,然后启动一个线程,传入b .socket,

3)线程里面,通过b从map里面获取b的socket,获取b的输出流,把a和a说的话写出去

4)客户b的输入流接受到输出流发来的消息,结束。

7、需要注意的事项都写在注释里面,下面放一张时序图,画的不太标准

网络编程1-TCP编程(socket)的更多相关文章

  1. 网络编程之TCP编程

    网络编程之TCP编程 前面已经介绍过关于TCP协议的东西,这里不做赘述.Java对于基于TCP协议的网络通信提供了良好的封装,Java使用socket对象来代表两端的通信窗口,并通过Socket产生I ...

  2. [Python] 网络编程之TCP编程

    转自:TCP编程 - 廖雪峰的官方网站 Socket是网络编程的一个抽象概念.通常我们用一个Socket表示“打开了一个网络链接”,而打开一个Socket需要知道目标计算机的IP地址和端口号,再指定协 ...

  3. Linux网络编程系列-TCP编程实例

    实例: client #include <stdio.h> #include <sys/socket.h> #include <netinet/in.h> #inc ...

  4. JAVA与网络开发(TCP:Socket、ServerSocket;UDP:DatagramSocket、DatagramPacket;多线程的C/S通讯、RMI开发概述)

    通过TCP建立可靠通讯信道 1)为了对应TCP协议里的客户端和服务器端,Socket包提供了Socket类和ServerSocket类. 2)Socket类构造函数及相关方法 Public Socke ...

  5. C#网络程序设计(3)网络传输编程之TCP编程

        网络传输编程指基于各种网络协议进行编程,包括TCP编程,UDP编程,P2P编程.本节介绍TCP编程.     (1)TCP简介: TCP是TCP/IP体系中最重要的传输层协议,它提供全双工和可 ...

  6. 牛客网Java刷题知识点之TCP、UDP、TCP和UDP的区别、socket、TCP编程的客户端一般步骤、TCP编程的服务器端一般步骤、UDP编程的客户端一般步骤、UDP编程的服务器端一般步骤

    福利 => 每天都推送 欢迎大家,关注微信扫码并加入我的4个微信公众号:   大数据躺过的坑      Java从入门到架构师      人工智能躺过的坑         Java全栈大联盟   ...

  7. 第1章 网络编程基础(3)——基本Socket通信

    服务器常用模型

  8. 网络层、传输层、应用层、端口通信协议编程接口 - http,socket,tcp/ip 网络传输与通讯知识总结

    引: http://coach.iteye.com/blog/2024511 什么是TCP和UDP,以及二者区别是什么? TCP的全称为传输控制协议.这种协议可以提供面向连接的.可靠的.点到点的通信. ...

  9. 网络编程——基于TCP协议的Socket编程,基于UDP协议的Socket编程

    Socket编程 目前较为流行的网络编程模型是客户机/服务器通信模式 客户进程向服务器进程发出要求某种服务的请求,服务器进程响应该请求.如图所示,通常,一个服务器进程会同时为多个客户端进程服务,图中服 ...

  10. 网络编程懒人入门(八):手把手教你写基于TCP的Socket长连接

    本文原作者:“水晶虾饺”,原文由“玉刚说”写作平台提供写作赞助,原文版权归“玉刚说”微信公众号所有,即时通讯网收录时有改动. 1.引言 好多小白初次接触即时通讯(比如:IM或者消息推送应用)时,总是不 ...

随机推荐

  1. 什么是QName

    看代码时经常碰到QName,当时对这个东东具体什么意思也是不太明白:今天在看SOAP消息的时候,想到这个东东,就去仔细看了下.QName其实就是Qualified Name的简称,在"Nam ...

  2. SQL ALTER TABLE 语句在项目中的使用

    1.在实际的项目开发过程中,之前已经创建好的实体类可能需要增加/删除字段,亦或是更改已有字段的属性,比如主键的增长策略从自增型改为UUID型,那么就会涉及到 SQL 中 alter table 语句的 ...

  3. D/A转换器实验

    1.代码: #include<reg52.h>typedef unsigned char u8;typedef unsigned int u16;void delay (u16 num){ ...

  4. javascript之查找数组中最小/最大的数

    实现原理:和数组的顺序查找很类似,都是逐个数据的比对. 废话不多说~ 代码如下: /* * 参数说明: * array:传入数组 ,例如:var arr = [5,7,66,78,99,103,126 ...

  5. socket传数据并记录到文件中

    最近在新项目中要通过socket传一些数据,下面是程序: 功能: 将客户端发送的json数据写入到日志文件中,如果数据不是json的,丢弃. 程序如下: #!/usr/bin/env python # ...

  6. 解决git pull 命令失效,不能从远程服务器上拉取代码问题

    用时候在用Git pull命令的时候不管用,拉取不下来远程分支上的代码,是因为本地分支和远程分支没有建立关联. 处理这种问题很简单就按照提示执行命令即可:git branch --set-upstre ...

  7. eclipse自动部署问题

    1. 使用myeclipse自动部署的方法(使用myeclipse 2015自动部署有问题,待解决)(换成2014的便可以自动部署): 1.Window->preferences->Mye ...

  8. Java数据结构——链表-单链表

    <1>链表 <2>引用和基本类型 <3>单链表 //================================================= // Fil ...

  9. typedef和#define的用法与区别

    typedef和#define的用法与区别 typedef和#define的用法与区别 一.typedef的用法 在C/C++语言中,typedef常用来定义一个标识符及关键字的别名,它是语言编译过程 ...

  10. C#--网络流Stream、字节数组保存到字符串中

    第一种方法: HttpWebRequest httpwebr = (HttpWebRequest)HttpWebRequest.Create(rstr); httpwebr.Method = &quo ...