基于java的socket编程
来源:互联网 发布:c语言getch和getchar 编辑:程序博客网 时间:2024/06/05 04:51
此文为原创,转摘请注明转摘自http://www.cnblogs.com/liusxg/p/3917624.html
socket编程:
一:什么是socket:socket是BSD UNIX的通信机制,通常称为“套接字”,其英文原意是“孔”或“插座”。有些顾名思义,socket正如其英文原意一样,像是一个多孔插座,可以提供多个端口的连接服务。
为了更加直观的了解socket,可以用插座来比喻socket。
如果说socket是一个多孔插座,插座是提供各种电器供电的地方,不同的电器工作时需要的电压和电流也不一样,但各种电器都有各自的一个插口,这个称之为“端口”。电器使用的电可以看做是网络资源或者是各种“流”,电是由电线传输过来的,所以插座需要连接电线,这里电线也就是服务器和客户端连接 “connection”。 其中初始化socket的过程像是买来一个插座的安装过程。
在插座这边的是“客户端”,电线那边提供电的发电厂是“服务器”。客户端和发电厂都各自拥有一个地址,即“IP地址”。其中还有一套传输和用电的规则,比如传输电时需要的电线多少伏才能满足需求,电器用电的技术参数,端口是几个孔的。这个是“协议”。正常情况下我们是不会去管协议的内容是什么,也就是说协议在我们面前是隐藏的。
下图可以有一些理解(图摘自源码工作室):
二.工作原理:对于服务器来说,服务器先初始化socket,然后端口绑定(bind),再对端口监听(listen),调用accept阻塞,等待客户端连接请求。对于客户端来说,客户端初始化socket,然后申请连接(connection)。客户端申请连接,服务器接受申请并且回复申请许可(这里要涉及TCP三次握手连接),然后发送数据,最后关闭连接,这是一次交互过程。
如下图(图摘自源码工作室):
客户端Client源码如下:
1 import java.io.*; 2 import java.net.*; 3 4 public class Client { 5 6 public static void main(String[] args) throws Exception { 7 // TODO 自动生成的方法存根 8 9 String readline = null;10 String inTemp = null;11 //String outTemp = null;12 String turnLine = "\n";13 final String client = "Client:";14 final String server = "Server:";15 16 int port = 4000;17 byte ipAddressTemp[] = {127, 0, 0, 1};18 InetAddress ipAddress = InetAddress.getByAddress(ipAddressTemp);19 20 //首先直接创建socket,端口号1~1023为系统保存,一般设在1023之外21 Socket socket = new Socket(ipAddress, port);22 23 //创建三个流,系统输入流BufferedReader systemIn,socket输入流BufferedReader socketIn,socket输出流PrintWriter socketOut;24 BufferedReader systemIn = new BufferedReader(new InputStreamReader(System.in));25 BufferedReader socketIn = new BufferedReader(new InputStreamReader(socket.getInputStream()));26 PrintWriter socketOut = new PrintWriter(socket.getOutputStream());27 28 while(readline != "bye"){29 30 System.out.println(client);31 readline = systemIn.readLine();32 //System.out.println(readline);33 34 socketOut.println(readline);35 socketOut.flush(); //赶快刷新使Server收到,也可以换成socketOut.println(readline, ture)36 37 //outTemp = readline;38 inTemp = socketIn.readLine();39 40 //System.out.println(client + outTemp);41 System.out.println(server + turnLine + inTemp);42 43 }44 45 systemIn.close();46 socketIn.close();47 socketOut.close();48 socket.close();49 50 }51 52 }
服务器Server源码如下:
import java.io.*;import java.net.*;public class Server { public static void main(String[] args) throws Exception { // TODO 自动生成的方法存根 String readline = null; String inTemp = null; //String outTemp = null; String turnLine = "\n"; final String client = "Client:"; final String server = "Server:"; int port = 4000; //byte ipAddressTemp[] = {127, 0, 0, 1}; //InetAddress ipAddress = InetAddress.getByAddress(ipAddressTemp); //首先直接创建serversocket ServerSocket serverSocket = new ServerSocket(port);
//调用服务器的accept()进行阻塞(程序会在这等待),当有申请连接时会打开阻塞并返回一个socket Socket socket = serverSocket.accept(); //创建三个流,系统输入流BufferedReader systemIn,socket输入流BufferedReader socketIn,socket输出流PrintWriter socketOut; BufferedReader systemIn = new BufferedReader(new InputStreamReader(System.in)); BufferedReader socketIn = new BufferedReader(new InputStreamReader(socket.getInputStream())); PrintWriter socketOut = new PrintWriter(socket.getOutputStream()); while(readline != "bye"){ inTemp = socketIn.readLine(); System.out.println(client + turnLine + inTemp); System.out.println(server); readline = systemIn.readLine(); socketOut.println(readline); socketOut.flush(); //赶快刷新使Client收到,也可以换成socketOut.println(readline, ture) //outTemp = readline; //System.out.println(server); } systemIn.close(); socketIn.close(); socketOut.close(); socket.close(); serverSocket.close(); }}
调试结果如下:
调试的时候要先启动服务器,客户端查不到服务器就运行不了。
运行效果还是很好的,幸运的是写完直接就可以运行了,关键是思路对,由此我总结出了一个规律,不管要做什么项目,首先要查阅资料,了解并理解其原理,还要思路清晰,这样子才能保证程序的成功率。还要多查阅java手册可以知道各种类的构造函数,返回值。提供一个java手册下载网址http://www.jb51.net/books/128276.html
另外通过socket编程还学会了一个调试的小技巧,就是多显示器的调试按这个小三角就好了
- 基于java的socket编程
- Java基于socket编程
- 基于Socket的java网络编程
- Java基于TCP的Socket编程练习
- 基于Socket的Java网络编程
- 基于Java的Socket编程技术
- 基于Socket的java网络编程
- 基于Socket的java网络编程
- 基于Socket的JAVA网络编程
- 基于Socket的java网络编程
- 基于Socket的java网络编程
- 基于Socket的java网络编程
- 基于UDP的Java Socket编程基础
- java网络编程:基于TCP的socket编程
- Java网络编程(基于TCP的socket编程)
- Java网络编程2(基于UDP的socket编程)
- Java网络编程——基于TCP的Socket编程
- Java网络编程——基于UDP的Socket编程
- BitSet的使用场景及简单示例
- 输入URL到展现页面的全过程
- java学习笔记一
- windows下安装Python
- 训练营第二天学习笔记
- 基于java的socket编程
- 函数的调用过程,栈帧的创建和销毁
- 串口通信
- Ambiguous mapping found. Cannot map 'xx' method
- 逻辑思维题之分桃问题
- shell 中 贪婪匹配 和 非贪婪匹配
- Direct3D学习笔记(三)——精灵变换(Srote_Scale)
- 指针小笔记1
- c++智能指针