java的的socket编程_基于java的socket编程

本文介绍了Java的Socket编程,包括Socket的概念、工作原理,并提供了客户端和服务器端的示例代码,帮助理解如何进行网络通信。通过实际操作,加深了对Java网络编程的理解。
摘要由CSDN通过智能技术生成

#开头的废话#学习java已经半个月了,原本在抠教材里面的字眼时,觉得教材好厚,要看完不知道要到猴年马月去了。突然在网上看到一个教程,里面老师说学编程语言书不用太细看,看个大概,知道里面讲些什么就好,不用全记得,然后你一个劲地编,使劲地编,编的时候不懂再回来看就好了,这是最快的方法。心里一琢磨,还真是这样,根据以前学C语言的情况不就这样吗。所以便加速看,把一些书里介绍的方法,类飞速地浏览过了,刷到网络这一章,觉得socket编程应该是得试一下手,不要只看不做假把式。

此文为原创,转摘请注明转摘自http://www.cnblogs.com/liusxg/p/3917624.html

socket编程:

一:什么是socket:socket是BSD UNIX的通信机制,通常称为“套接字”,其英文原意是“孔”或“插座”。有些顾名思义,socket正如其英文原意一样,像是一个多孔插座,可以提供多个端口的连接服务。

为了更加直观的了解socket,可以用插座来比喻socket。

如果说socket是一个多孔插座,插座是提供各种电器供电的地方,不同的电器工作时需要的电压和电流也不一样,但各种电器都有各自的一个插口,这个称之为“端口”。电器使用的电可以看做是网络资源或者是各种“流”,电是由电线传输过来的,所以插座需要连接电线,这里电线也就是服务器和客户端连接“connection”。 其中初始化socket的过程像是买来一个插座的安装过程。

在插座这边的是“客户端”,电线那边提供电的发电厂是“服务器”。客户端和发电厂都各自拥有一个地址,即“IP地址”。其中还有一套传输和用电的规则,比如传输电时需要的电线多少伏才能满足需求,电器用电的技术参数,端口是几个孔的。这个是“协议”。正常情况下我们是不会去管协议的内容是什么,也就是说协议在我们面前是隐藏的。

下图可以有一些理解(图摘自源码工作室):

c630625f0d276aab8ead744930f46a95.png

二.工作原理:对于服务器来说,服务器先初始化socket,然后端口绑定(bind),再对端口监听(listen),调用accept阻塞,等待客户端连接请求。对于客户端来说,客户端初始化socket,然后申请连接(connection)。客户端申请连接,服务器接受申请并且回复申请许可(这里要涉及TCP三次握手连接),然后发送数据,最后关闭连接,这是一次交互过程。

如下图(图摘自源码工作室):

d0704ec0d44def032d2590b0a428e0dc.png

客户端Client源码如下:

1 import java.io.*;2 import java.net.*;3

4 public classClient {5

6 public static void main(String[] args) throwsException {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 = newSocket(ipAddress, port);22

23 //创建三个流,系统输入流BufferedReader systemIn,socket输入流BufferedReader socketIn,socket输出流PrintWriter socketOut;

24 BufferedReader systemIn = new BufferedReader(newInputStreamReader(System.in));25 BufferedReader socketIn = new BufferedReader(newInputStreamReader(socket.getInputStream()));26 PrintWriter socketOut = newPrintWriter(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 classServer {public static void main(String[] args) throwsException {//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 = newServerSocket(port);

//调用服务器的accept()进行阻塞(程序会在这等待),当有申请连接时会打开阻塞并返回一个socket

Socket socket=serverSocket.accept();//创建三个流,系统输入流BufferedReader systemIn,socket输入流BufferedReader socketIn,socket输出流PrintWriter socketOut;

BufferedReader systemIn = new BufferedReader(newInputStreamReader(System.in));

BufferedReader socketIn= new BufferedReader(newInputStreamReader(socket.getInputStream()));

PrintWriter socketOut= newPrintWriter(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();

}

}

调试结果如下:

c5d8c563ba5d16fb505cc56ca6defac0.png

c59aae70abe0844343473d9097fd61bf.png

调试的时候要先启动服务器,客户端查不到服务器就运行不了。

运行效果还是很好的,幸运的是写完直接就可以运行了,关键是思路对,由此我总结出了一个规律,不管要做什么项目,首先要查阅资料,了解并理解其原理,还要思路清晰,这样子才能保证程序的成功率。还要多查阅java手册可以知道各种类的构造函数,返回值。提供一个java手册下载网址http://www.jb51.net/books/128276.html

另外通过socket编程还学会了一个调试的小技巧,就是多显示器的调试按这个小三角就好了

80fc60abaa2baa09b69633a29209e29e.png

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值