关键词:
1. Socket 编程原理
网络上的实体通过端到端的连接进行数据的发送与接收,即进行通信。通信的一端就叫做一个socket。要通过socket进行通信,服务端和客户端都需要为通信做一些准备。
首先,服务端需要初始化socket,然后为socket绑定端口和IP,客户端使用这个IP和端口表名要与哪个服务端进行通信。
然后,服务端对socket进行监听
客户端需要初始化socket,绑定要连接的服务端的IP和端口,系统也会为客户端分配默认的IP和端口
这时如果客户端调用connet()函数,就会发送建立连接的请求到服务端,服务端此时如果正在监听这个socket,并且监听到了这个请求,就会调用accept()接收这个请求,然后告诉客户端已经收到了它的建立连接的请求,阻塞在accept()上,这时客户端发送ACK到服务端connect()返回。服务器收到这个ACK,连接建立,accept()返回。socket连接在通信双方建立起来,双方都可以通过write()和read()进行数据的发送与接收。
具体原理如下图所示:
2. Java的socket编程实例
(1) 客户端代码
1 import java.io.BufferedReader; 2 import java.io.BufferedWriter; 3 import java.io.IOException; 4 import java.io.InputStreamReader; 5 import java.io.OutputStreamWriter; 6 import java.net.Socket; 7 import java.net.UnknownHostException; 8 /* 9 * inputReader.readLine()读取的字符串没有加上"\n",所以服务端调用readLine读取的时候,没有读到"\n"于是阻塞; 10 * eclipse的显示平台混乱 11 */ 12 public class Client { 13 Socket socket; 14 15 public static void main(String[] args) { 16 // TODO Auto-generated method stub 17 Client client = new Client(); 18 try { 19 client.runClient(); 20 } catch (UnknownHostException e) { 21 // TODO Auto-generated catch block 22 e.printStackTrace(); 23 } catch (IOException e) { 24 // TODO Auto-generated catch block 25 e.printStackTrace(); 26 }finally{ 27 try { 28 client.socket.close(); 29 } catch (IOException e) { 30 // TODO Auto-generated catch block 31 e.printStackTrace(); 32 } 33 } 34 } 35 public void runClient() throws UnknownHostException, IOException{ 36 //Scanner outScanner = new Scanner(System.in); 37 Socket socket = new Socket("127.0.0.1", 40004); 38 this.socket = socket; 39 System.out.println("客户端连接到"+socket.getRemoteSocketAddress()); 40 BufferedWriter socketWriter = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream())); 41 BufferedReader socketReader = new BufferedReader(new InputStreamReader(socket.getInputStream())); 42 BufferedReader inputReader = new BufferedReader(new InputStreamReader(System.in)); 43 String inString = ""; 44 String string = inputReader.readLine(); 45 while (string != null) { 46 socketWriter.write(string); 47 socketWriter.write("\n"); 48 socketWriter.flush(); 49 System.out.println("客户端发送"+string); 50 if(string.equals("bye")){ 51 break; 52 } 53 inString = socketReader.readLine(); 54 System.out.println("客户端收到:" + inString); 55 string = inputReader.readLine(); 56 //inString = socketReader.readLine(); 57 } 58 System.out.println("客户端结束"); 59 socket.close(); 60 } 61 62 }
(2) 服务端代码
1 /* 2 * 一个套接字接口构成一个连接的一端,可以对它进行读写,读写之前要先打开,结束读写之后要进行关闭 3 * 1. 服务器端打开socket的过程如下 4 * IP和Port可以唯一的确定一端,所以通过ip和port初始化socket,通过bind() 5 * listen()进行监听 6 * accept()等待客户端的请求,然后创建连接 7 * write() 8 * read() 9 * 2. 通过使用线程为多个客户端进行服务 10 * 11 */ 12 import java.io.BufferedReader; 13 import java.io.BufferedWriter; 14 import java.io.IOException; 15 import java.io.InputStreamReader; 16 import java.io.OutputStreamWriter; 17 import java.net.ServerSocket; 18 import java.net.Socket; 19 20 public class Server { 21 22 public static void main(String[] args) { 23 // TODO Auto-generated method stub 24 Server server = new Server(); 25 server.runServer(); 26 } 27 public void runServer(){ 28 ServerSocket serverSocket = null; 29 try { 30 serverSocket = new ServerSocket(40004); 31 while (true) { 32 Socket socket = serverSocket.accept(); 33 DisposeThread runnable = new DisposeThread(socket); 34 Thread thread = new Thread(runnable); 35 thread.start(); 36 } 37 } catch (IOException e) { 38 // TODO Auto-generated catch block 39 e.printStackTrace(); 40 }finally{ 41 try { 42 if(serverSocket != null){ 43 serverSocket.close(); 44 } 45 } catch (IOException e) { 46 // TODO Auto-generated catch block 47 e.printStackTrace(); 48 } 49 } 50 } 51 class DisposeThread implements Runnable{ 52 Socket socket; 53 public DisposeThread(Socket socket) { 54 // TODO Auto-generated constructor stub 55 this.socket = socket; 56 } 57 @Override 58 public void run() { 59 // TODO Auto-generated method stub 60 try { 61 BufferedReader readerSocket = new BufferedReader(new InputStreamReader(socket.getInputStream())); 62 BufferedWriter writerSocket = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream())); 63 String string = readerSocket.readLine(); 64 while (string != null) { 65 System.out.println("服务端收到:" + string); 66 if(string.equals("bye")){ 67 break; 68 } 69 writerSocket.write(string+"\n"); 70 writerSocket.flush(); 71 string = readerSocket.readLine(); 72 } 73 socket.close(); 74 } catch (IOException e) { 75 // TODO Auto-generated catch block 76 e.printStackTrace(); 77 }finally{ 78 try { 79 socket.close(); 80 } catch (IOException e) { 81 // TODO Auto-generated catch block 82 e.printStackTrace(); 83 } 84 } 85 } 86 87 } 88 89 }
java-30java网络编程
Java网络编程网络编程是指编写运行在多个设备(计算机)的程序,这些设备都通过网络连接起来。java.net包中J2SE的API包含有类和接口,它们提供低层次的通信细节。你可以直接使用这些类和接口,来专注于解决问题,而不用关... 查看详情
java网络编程:
一、 查看详情
java网络编程
Java网络编程的API都在Java.net包里面。网络编程三要素:1.IP2.端口3.协议(TCP、UDP) 一、IPpackagecom.StadyJava.day16;importjava.net.InetAddress;importjava.net.UnknownHostException;publicclassSetDemo{publicstatic 查看详情
java基础之网络编程
网络编程概述: Java是Internet上的语言,它从语言级上提供了对网络应用程序的支持,程序员能够很容易开发常见的网络应用程序。 Java提供的网络类库,可以实现无痛的网络连接,联网的底层细节被隐藏在Java的本机安装... 查看详情
java网络编程url编程
摘自b站尚硅谷JAVA视频教程 查看详情
java中基于udp协议的的网络编程(基础篇)
---恢复内容开始---一:什么是网络编程? 通俗的来说,网络编程就是编写程序,让联网的两个或多个设备(例如计算机)之间进行数据传输。Java语言也支持网络编程,JDK提供的java.net包提供了很多于网络编程相关的类,来支持... 查看详情
java从零开始学习——java网络编程
网络编程1、概述TCP(电话)、UDP(邮件)1.1、计算机网络计算机网络是指将地理位置不同的具有独立功能的多台计算机及其外部设备,通过通信线路连接起来,在网络操作系统,网络管理软件及网络通信协议的管理和协调下,实现资... 查看详情
12.3-全栈java笔记:java网络编程
Java为了可移植性,不允许直接调用操作系统,而是由java.net包来提供网络功能。Java虚拟机负责提供与操作系统的实际连接。 InetAddress作用:封装计算机的IP地址和DNS(没有端口信息!)。特点:这个类没有构造函数。如果要... 查看详情
java网络编程
...计算机设备互连起来,实现资源共享和数据传输的系统。网络编程就就是编写程序使联网的两个(或多个)设备(例如计算机)之间进行数据传输。Java语言对网络编程提供了良好的支持,通过其提供的接口我们可以很方便地进行网络... 查看详情
java网络编程基础
...,Java所提供的网络功能可大致分为三类。基于HTTP协议的网络编程:这是三大类功能中最高级的一种。通过URL的网络资源表达方式,很容易确实网络上数据的位置。利用URL和URLConnection,Java程序可以直接读入网络上所放的数据,... 查看详情
java:java基础socket网络编程
使用DatagramSocket创建一个UDP协议的Socket,用DatagramPacket创建一个数据包,可以指定ip和端口号以及包的数据,用socket.send()可以发送这个数据包,代码实例:Stringstr="这是数据";DatagramSocketsocket=newDatagramSocket();DatagramPacketpacket=newDatagramPacket(s 查看详情
java网络编程
Java网络编程 网络编程是指编写运行在多个设备(计算机)的程序,这些设备都通过网络连接起来。 java.net包中J2SE的API包含有类和接口,它们提供低层次的通信细节。你可以直接使用这些类和接口,来专注于解决问题,... 查看详情
java并发编程:核心理论
Java并发编程系列:Java并发编程:核心理论 Java并发编程:Synchronized及其实现原理Java并发编程:Synchronized底层优化(轻量级锁、偏向锁)Java并发编程:线程间的协作(wait/notify/sleep/yield/join)Java并发编程:volatile的使用及其原理... 查看详情
java-web学习-java基础-网络编程(tcp和udp)附tcp实现通信
目录网络编程计算机网络基础IP与PortIP->InetAddress类Port网络通信协议URL定位Restful的风格TCP网络编程Socket套接字Java下的基于Socket的TCP编程UDP网络编程Java下的UDP编程实践代码(TCP实现)网络编程“Java是Internet上的语言”,其从语言级... 查看详情
java网络编程
网络编程Java的网络通信非常简单,服务器端通过ServerSocket建立监听,客户端通过Socket连接到指定服务器后,通信双方就可以通过IO流进行通信。OSI模型:开放系统互连参考模型(OpenSystemInterConnection),力求将网络简化,并以模... 查看详情
java网络编程
Java网络编程网络编程是指编写运行在多个设备(计算机)的程序,这些设备都通过网络连接起来。java.net包中J2SE的API包含有类和接口,它们提供低层次的通信细节。你可以直接使用这些类和接口,来专注于解决问题,而不用关... 查看详情
java网络编程
Java网络编程网络编程是指编写运行在多个设备(计算机)的程序,这些设备都通过网络连接起来。java.net包中J2SE的API包含有类和接口,它们提供低层次的通信细节。你可以直接使用这些类和接口,来专注于解决问题,而不用关... 查看详情
第13篇-java网络编程
第13篇-JAVA网络编程每篇一句 比我强大的人都在努力我还有什么理由不拼命初学心得不去追逐你所渴求你将永远不会拥有(笔者JEEP/711)[JAVA笔记|时间:2017-04-22|JAVA网络编程]1.网络编程基本概念1.什么是计算机网络 计算机网络... 查看详情