sockedjava的简单介绍
本篇文章给大家谈谈sockedjava,以及对应的知识点,希望对各位有所帮助,不要忘了收藏本站喔。
本文目录一览:
- 1、java Socket通信原理
- 2、java socket有什么作用
- 3、java中的socket是什么意思?
- 4、Java Socket重要参数讲解
- 5、Java的Socket编程?
- 6、java中的socket编程是作什么的
java Socket通信原理
具体如下:
首先socket 通信是基于TCP/IP 网络层上的一种传送方式,我们通常把TCP和UDP称为传输层。其中UDP是一种面向无连接的传输层协议。UDP不关心对端是否真正收到了传送过去的数据。
如果需要检查对端是否收到分组数据包,或者对端是否连接到网络,则需要在应用程序中实现。UDP常用在分组数据较少或多播、广播通信以及视频通信等多媒体领域。
在这里我们不进行详细讨论,这里主要讲解的是基于TCP/IP协议下的socket通信。
socket是基于应用服务与TCP/IP通信之间的一个抽象,他将TCP/IP协议里面复杂的通信逻辑进行分装。
服务端初始化ServerSocket,然后对指定的端口进行绑定,接着对端口及进行监听,通过调用accept方法阻塞。
此时,如果客户端有一个socket连接到服务端,那么服务端通过监听和accept方法可以与客户端进行连接。
Java是一门面向对象编程语言,不仅吸收了C++语言的各种优点,还摒弃了C++里难以理解的多继承、指针等概念,因此Java语言具有功能强大和简单易用两个特征。
Java语言作为静态面向对象编程语言的代表,极好地实现了面向对象理论,允许程序员以优雅的思维方式进行复杂的编程。
Java具有简单性、面向对象、分布式、健壮性、安全性、平台独立与可移植性、多线程、动态性等特点。Java可以编写桌面应用程序、Web应用程序、分布式系统和嵌入式系统应用程序等。
java socket有什么作用
socket 用来写网络通讯程序的,简单来说在远程机器,和本地机器各建一个socket,然后进行连接通讯即可。
QQ什么的都网络通讯都是采用socket来写的。
有兴趣的话看看网络编程(非Web网络编程)方面的书
java中的socket是什么意思?
所谓socket通常也称作"套接字",用于描述IP地址和端口,是一个通信链的句柄。应用程序通常通过"套接字"向网络发出请求或者应答网络请求。\x0d\x0a以J2SDK-1.3为例,Socket和ServerSocket类库位于java.net包中。ServerSocket用于服务器端,Socket是建立网络连接时使用的。在连接成功时,应用程序两端都会产生一个Socket实例,操作这个实例,完成所需的会话。对于一个网络连接来说,套接字是平等的,并没有差别,不因为在服务器端或在客户端而产生不同级别。不管是Socket还是ServerSocket它们的工作都是通过SocketImpl类及其子类完成的。\x0d\x0a重要的Socket API:\x0d\x0ajava.net.Socket继承于java.lang.Object,有八个构造器,其方法并不多,下面介绍使用最频繁的三个方法,其它方法大家可以见JDK-1.3文档。\x0d\x0a. Accept方法用于产生"阻塞",直到接受到一个连接,并且返回一个客户端的Socket对象实例。"阻塞"是一个术语,它使程序运行暂时"停留"在这个地方,直到一个会话产生,然后程序继续;通常"阻塞"是由循环产生的。\x0d\x0a. getInputStream方法获得网络连接输入,同时返回一个InputStream对象实例。\x0d\x0a. getOutputStream方法连接的另一端将得到输入,同时返回一个OutputStream对象实例。\x0d\x0a注意:其中getInputStream和getOutputStream方法均会产生一个IOException,它必须被捕获,因为它们返回的流对象,通常都会被另一个流对象使用。\x0d\x0a2ServerSocket类例子编辑\x0d\x0a\x0d\x0apackage com.lanber.socket;\x0d\x0aimport java.io.DataInputStream;\x0d\x0aimport java.io.DataOutputStream;\x0d\x0aimport java.io.IOException;\x0d\x0aimport java.net.ServerSocket;\x0d\x0aimport java.net.Socket;\x0d\x0apublic class ServerDemo {\x0d\x0a/**\x0d\x0a* 注意:Socket的发送与接收是需要同步进行的,即客户端发送一条信息,服务器必需先接收这条信息,\x0d\x0a* 而后才可以向客户端发送信息,否则将会有运行时出错。\x0d\x0a* @param args\x0d\x0a*/\x0d\x0apublic static void main(String[] args) {\x0d\x0aServerSocket ss = null;\x0d\x0atry {\x0d\x0ass = new ServerSocket(8888);\x0d\x0a//服务器接收到客户端的数据后,创建与此客户端对话的Socket\x0d\x0aSocket socket = ss.accept();\x0d\x0a//用于向客户端发送数据的输出流\x0d\x0aDataOutputStream dos = new DataOutputStream(socket.getOutputStream());\x0d\x0a//用于接收客户端发来的数据的输入流\x0d\x0aDataInputStream dis = new DataInputStream(socket.getInputStream());\x0d\x0aSystem.out.println("服务器接收到客户端的连接请求:" + dis.readUTF());\x0d\x0a//服务器向客户端发送连接成功确认信息\x0d\x0ados.writeUTF("接受连接请求,连接成功!");\x0d\x0a//不需要继续使用此连接时,关闭连接\x0d\x0asocket.close();\x0d\x0ass.close();\x0d\x0a} catch (IOException e) {\x0d\x0ae.printStackTrace();\x0d\x0a}\x0d\x0a}\x0d\x0a}\x0d\x0a\x0d\x0a3客户端的例子编辑\x0d\x0apackage com.lanber.socket;\x0d\x0aimportjava.io.DataInputStream;\x0d\x0aimport java.io.DataOutputStream;\x0d\x0aimportjava.io.IOException;\x0d\x0aimport java.io.OutputStream;\x0d\x0aimport java.net.Socket;\x0d\x0aimport java.net.UnknownHostException;\x0d\x0apublic class ClientDemo {\x0d\x0a/**\x0d\x0a* @param args\x0d\x0a*/\x0d\x0apublic static void main(String[] args) {\x0d\x0aSocket socket = null;\x0d\x0atry {\x0d\x0asocket = new Socket("localhost",8888);\x0d\x0a//获取输出流,用于客户端向服务器端发送数据\x0d\x0aDataOutputStream dos = new DataOutputStream(socket.getOutputStream());\x0d\x0a//获取输入流,用于接收服务器端发送来的数据\x0d\x0aDataInputStream dis = new DataInputStream(socket.getInputStream());\x0d\x0a//客户端向服务器端发送数据\x0d\x0ados.writeUTF("我是客户端,请求连接!");\x0d\x0a//打印出从服务器端接收到的数据\x0d\x0aSystem.out.println(dis.readUTF());\x0d\x0a//不需要继续使用此连接时,记得关闭哦\x0d\x0asocket.close();\x0d\x0a} catch (UnknownHostException e) {\x0d\x0ae.printStackTrace();\x0d\x0a} catch (IOException e) {\x0d\x0ae.printStackTrace();\x0d\x0a}\x0d\x0a}\x0d\x0a}
Java Socket重要参数讲解
Java Socket的api可能很多人会用 但是Java Socket的参数可能很多人都不知道用来干嘛的 甚至都不知道有这些参数
backlog
用于ServerSocket 配置ServerSocket的最大客户端等待队列 等待队列的意思 先看下面代码
public class Main { public static void main(String[] args) throws Exception { int port = int backlog = ServerSocket serverSocket = new ServerSocket(port backlog) Socket clientSock = serverSocket accept() System out println( revcive from + clientSock getPort()) while (true) { byte buf[] = new byte[ ] int len = clientSock getInputStream() read(buf) System out println(new String(buf len)) }这段测试代码在第一次处理一个客户端时 就不会处理第二个客户端 所以除了第一个客户端 其他客户端就是等待队列了 所以这个服务器最多可以同时连接 个客户端 其中 个等待队列 大家可以telnet localhost 测试下
这个参数设置为 表示无限制 默认是 个最大等待队列 如果设置无限制 那么你要小心了 如果你服务器无法处理那么多连接 那么当很多客户端连到你的服务器时 每一个TCP连接都会占用服务器的内存 最后会让服务器崩溃的
另外 就算你设置了backlog为 如果你的代码中是一直Socket clientSock = serverSocket accept() 假设我们的机器最多可以同时处理 个请求 总共有 个线程在运行 然后你把在 个线程的线程池处理clientSock 不能处理的clientSock就排队 最后clientSock越来越多 也意味着TCP连接越来越多 也意味着我们的服务器的内存使用越来越高(客户端连接进程 肯定会发送数据过来 数据会保存到服务器端的TCP接收缓存区) 最后服务器就宕机了 所以如果你不能处理那么多请求 请不要循环无限制地调用serverSocket accept() 否则backlog也无法生效 如果真的请求过多 只会让你的服务器宕机(相信很多人都是这么写 要注意点)
TcpNoDelay
禁用纳格算法 将数据立即发送出去 纳格算法是以减少封包传送量来增进TCP/IP网络的效能 当我们调用下面代码 如
Socket socket = new Socket() nnect(new InetSocketAddress(host )) InputStream in = socket getInputStream() OutputStream out = socket getOutputStream() String head = hello String body = world\r\n out write(head getBytes()) out write(body getBytes()) 我们发送了hello 当hello没有收到ack确认(TCP是可靠连接 发送的每一个数据都要收到对方的一个ack确认 否则就要重发)的时候 根据纳格算法 world不会立马发送 会等待 要么等到ack确认(最多等 ms对方会发过来的) 要么等到TCP缓冲区内容=MSS 很明显这里没有机会 我们写了world后再也没有写数据了 所以只能等到hello的ack我们才会发送world 除非我们禁用纳格算法 数据就会立即发送了
SoLinger
当我们调用socket close()返回时 socket已经write的数据未必已经发送到对方了 例如
Socket socket = new Socket() nnect(new InetSocketAddress(host )) InputStream in = socket getInputStream() OutputStream out = socket getOutputStream() String head = hello String body = world\r\n out write(head getBytes()) out write(body getBytes()) socket close()
这里调用了socket close()返回时 hello和world未必已经成功发送到对方了 如果我们设置了linger而不小于 如
bool on = true int linger = ……
socket setSoLinger(boolean on int linger)
……
socket close() 那么close会等到发送的数据已经确认了才返回 但是如果对方宕机 超时 那么会根据linger设定的时间返回
UrgentData和OOBInline
TCP的紧急指针 一般都不建议使用 而且不同的TCP/IP实现 也不同 一般说如果你有紧急数据宁愿再建立一个新的TCP/IP连接发送数据 让对方紧急处理
所以这两个参数 你们可以忽略吧 想知道更多的 自己查下资料
SoTimeout
设置socket调用InputStream读数据的超时时间 以毫秒为单位 如果超过这个时候 会抛出 SocketTimeoutException
KeepAlive
keepalive不是说TCP的常连接 当我们作为服务端 一个客户端连接上来 如果设置了keeplive为true 当对方没有发送任何数据过来 超过一个时间(看系统内核参数配置) 那么我们这边会发送一个ack探测包发到对方 探测双方的TCP/IP连接是否有效(对方可能断点 断网) 在Linux好像这个时间是 秒 如果不设置 那么客户端宕机时 服务器永远也不知道客户端宕机了 仍然保存这个失效的连接
SendBufferSize和ReceiveBufferSize
TCP发送缓存区和接收缓存区 默认是 一般情况下足够了 而且就算你增加了发送缓存区 对方没有增加它对应的接收缓冲 那么在TCP三握手时 最后确定的最大发送窗口还是双方最小的那个缓冲区 就算你无视 发了更多的数据 那么多出来的数据也会被丢弃 除非双方都协商好
lishixinzhi/Article/program/Java/hx/201311/26575
Java的Socket编程?
要通信首先要建立socket链接。
1 ab客户端与服务端建立socket链接
2 a客户端发送消息到服务端
3 服务端收到消息后,发送到指定的b客户端
4 b客户端处理来自服务端的消息
java中的socket编程是作什么的
Socket,又称为套接字,Socket是计算机网络通信的基本的技术之一。如今大多数基于网络的软件,如浏览器,即时通讯工具甚至是P2P下载都是基于Socket实现的。本文会介绍一下基于TCP/IP的Socket编程,并且如何写一个客户端/服务器程序。
方法/步骤
Java中的socket编程 下面的部分将通过一些示例讲解一下如何使用socket编写客户端和服务器端的程序。 注意:在接下来的示例中,我将使用基于TCP/IP协议的socket编程,因为这个协议远远比UDP/IP使用的要广泛。并且所有的socket相关的类都位于java.net包下,所以在我们进行socket编程时需要引入这个包。
写入数据 接下来就是写入请求数据,我们从客户端的socket对象中得到OutputStream对象,然后写入数据后。很类似文件IO的处理代码。
打开服务器端的socket
读取数据 通过上面得到的socket对象获取InputStream对象,然后安装文件IO一样读取数据即可。这里我们将内容打印出来。
使用socket实现一个回声服务器,就是服务器会将客户端发送过来的数据传回给客户端。
sockedjava的介绍就聊到这里吧,感谢你花时间阅读本站内容,更多关于、sockedjava的信息别忘了在本站进行查找喔。