javasocket

     2022-03-14     446

关键词:

转载自并发编程网 – ifeve.com本文链接地址: Java网络教程之Socket
Java网络教程-基础
Java提供了非常易用的网络API,调用这些API我们可以很方便的通过建立TCP/IP或UDP套接字,在网络之间进行相互通信,其中TCP要比UDP更加常用,但在本教程中我们对这两种方式都有说明。
在网站上还有其他三个与Java网络相关的教程,如下:
1.Java IO 教程
2.Java NIO 教程
3.Java服务器多线程教程 (参与翻译可以联系我们)
尽管Java网络API允许我们通过套接字(Socket)打开或关闭网络连接,但所有的网络通信均是基于Java IO类 InputStream和OutputStream实现的。
此外,我们还可以使用Java NIO API中相关的网络类,用法与Java网络API基本类似,Java NIO API可以以非阻塞模式工作,在某些特定的场景中使用非阻塞模式可以获得较大的性能提升。
Java TCP网络基础
通常情况下,客户端打开一个连接到服务器端的TCP/IP连接,然后客户端开始与服务器之间通信,当通信结束后客户端关闭连接,过程如下图所示:
技术分享

客户端通过一个已打开的连接可以发送不止一个请求。事实上在服务器处于接收状态下,客户端可以发送尽可能多的数据,服务器也可以主动关闭连接。
Java中Socket类和ServerSocket类
当客户端想要打开一个连接到服务器的TCP/IP连接时,就要使用到Java Socket类。socket类只需要被告知连接的IP地址和TCP端口,其余的都有Java实现。
假如我们想要打开一个监听服务,来监听客户端连接某些指定TCP端口的连接,那就需要使用Java ServerSocket类。当客户端通过Socket连接服务器端的ServerSocket监听时,服务器端会指定这个连接的一个Socket,此时客户端与服务器端间的通信就变成Socket与Socket之间的通信。
关于Socket类和ServerSocket类会在后面的文章中有详细的介绍。
Java UDP网络基础
UDP的工作方式与TCP相比略有不同。使用UDP通信时,在客户端与服务器之间并没有建立连接的概念,客户端发送到服务器的数据,服务器可能(也可能并没有)收到这些数据,而且客户端也并不知道这些数据是否被服务器成功接收。当服务器向客户端发送数据时也是如此。
正因为是不可靠的数据传输,UDP相比与TCP来说少了很多的协议开销。
在某些场景中,使用无连接的UDP要优于TCP,这些在文章Java UDP DatagramSocket类介绍中会有更多介绍。

Java网络教程之Socket
当我们想要在Java中使用TCP/IP通过网络连接到服务器时,就需要创建java.net.Socket对象并连接到服务器。假如希望使用Java NIO,也可以创建Java NIO中的SocketChannel对象。
创建Socket
下面的示例代码是连接到IP地址为78.64.84.171服务器上的80端口,这台服务器就是我们的Web服务器(www.jenkov.com),而80端口就是Web服务端口。
Socket socket = new Socket("78.46.84.171", 80);
我们也可以像如下示例中使用域名代替IP地址:
Socket socket = new Socket("jenkov.com", 80);
Socket发送数据
要通过Socket发送数据,我们需要获取Socket的输出流(OutputStream),示例代码如下:
Socket socket = new Socket("jenkov.com", 80);
OutputStream out = socket.getOutputStream();
out.write("some data".getBytes());
out.flush();
out.close();
socket.close();
代码非常简单,但是想要通过网络将数据发送到服务器端,一定不要忘记调用flush()方法。操作系统底层的TCP/IP实现会先将数据放入一个更大的数据缓存块中,而缓存块的大小是与TCP/IP的数据包大小相适应的。(译者注:调用flush()方法只是将数据写入操作系统缓存中,并不保证数据会立即发送)
Socket读取数据
从Socket中读取数据,我们就需要获取Socket的输入流(InputStream),代码如下:
Socket socket = new Socket("jenkov.com", 80);
InputStream in = socket.getInputStream();
int data = in.read();
//... read more data...
in.close();
socket.close();
代码也并不复杂,但需要注意的是,从Socket的输入流中读取数据并不能读取文件那样,一直调用read()方法直到返回-1为止,因为对Socket而言,只有当服务端关闭连接时,Socket的输入流才会返回-1,而是事实上服务器并不会不停地关闭连接。假设我们想要通过一个连接发送多个请求,那么在这种情况下关闭连接就显得非常愚蠢。
因此,从Socket的输入流中读取数据时我们必须要知道需要读取的字节数,这可以通过让服务器在数据中告知发送了多少字节来实现,也可以采用在数据末尾设置特殊字符标记的方式连实现。
关闭Socket
当使用完Socket后我们必须将Socket关闭,断开与服务器之间的连接。关闭Socket只需要调用Socket.close()方法即可,代码如下:
Socket socket = new Socket("jenkov.com", 80);
socket.close();

Java 网络教程: ServerSocket
用java.net.ServerSocket实现java服务通过TCP/IP监听客户端连接,你也可以用Java NIO 来代替java网络标准API,这时候需要用到 ServerSocketChannel。
创建一个 ServerSocket连接
以下是一个创建ServerSocket类来监听9000端口的一个简单的代码
ServerSocket serverSocket = new ServerSocket(9000);
监听请求的连接
要获取请求的连接需要用ServerSocket.accept()方法。该方法返回一个Socket类,该类具有普通java Socket类的所有特性。代码如下:
ServerSocket serverSocket = new ServerSocket(9000); boolean isStopped = false;while(!isStopped){ Socket clientSocket = serverSocket.accept(); //do something with clientSocket}
对每个调用了accept()方法的类都只获得一个请求的连接。
另外,请求的连接也只能在线程运行的server中调用了accept()方法之后才能够接受请求。线程运行在server中其它所有的方法上的时候都不能接受客户端的连接请求。所以”接受”请求的线程通常都会把Socket的请求连接放入一个工作线程池中,然后再和客户端连接。更多关于多线程服务端设计的文档请参考 java多线程服务
关闭客户端Socket
客户端请求执行完毕,并且不会再有该客户端的其它请求发送过来的时候,就需要关闭Socket连接,这和关闭一个普通的客户端Socket连接一样。如下代码来执行关闭:
socket.close();
关闭服务端Sockets
要关闭服务的时候需要关掉 ServerSocket连接。通过执行如下代码:
serverSocket.close();

Java网络教程:URL + URLConnection(转载http://ifeve.com/java-netword-url-urlconnection/)
目录
HTTP GET和POST
从URLs到本地文件
在java.net包中包含两个有趣的类:URL类和URLConnection类。这两个类可以用来创建客户端到web服务器(HTTP服务器)的连接。下面是一个简单的代码例子:
URL url = new URL("http://jenkov.com");
URLConnection urlConnection = url.openConnection();
InputStream input = urlConnection.getInputStream();
int data = input.read();
while(data != -1){
System.out.print((char) data);
data = input.read();
}
input.close();
HTTP GET和POST
默认情况下URLConnection发送一个HTTP GET请求到web服务器。如果你想发送一个HTTP POST请求,要调用URLConnection.setDoOutput(true)方法,如下:
URL url = new URL("http://jenkov.com");
URLConnection urlConnection = url.openConnection();
urlConnection.setDoOutput(true);
一旦你调用了setDoOutput(true),你就可以打开URLConnection的OutputStream,如下:
OutputStream output = urlConnection.getOutputStream();
你可以使用这个OutputStream向相应的HTTP请求中写任何数据,但你要记得将其转换成URL编码(关于URL编码的解释,自行Google)(译者注:具体名字是:application/x-www-form-urlencoded MIME 格式编码)。
当你写完数据的时候要记得关闭OutputStream。
从URLs到本地文件
URL也被叫做统一资源定位符。如果你的代码不关心文件是来自网络还是来自本地文件系统,URL类是另外一种打开文件的方式。
下面是一个如何使用URL类打开一个本地文件系统文件的例子:
URL url = new URL("file:/c:/data/test.txt");
URLConnection urlConnection = url.openConnection();
InputStream input = urlConnection.getInputStream();
int data = input.read();
while(data != -1){
System.out.print((char) data);
data = input.read();
}
input.close();
注意:这和通过HTTP访问一个web服务器上的文件的唯一不同处就是URL:”file:/c:/data/test.txt”。

Java 网络教程: InetAddress
创建一个 InetAddress 实例
InetAddress 的内部方法
InetAddress 是 Java 对 IP 地址的封装。这个类的实例经常和 UDP DatagramSockets 和 Socket,ServerSocket 类一起使用。
创建一个 InetAddress 实例
InetAddress 没有公开的构造方法,因此你必须通过一系列静态方法中的某一个来获取它的实例。
<!–more–>
下面是为一个域名实例化 InetAddres 类的例子:
InetAddress address = InetAddress.getByName("jenkov.com");
当然也会有为匹配某个 IP 地址来实例化一个 InetAddress:
InetAddress address = InetAddress.getByName("78.46.84.171");
另外,它还有通过获取本地 IP 地址的来获取 InetAddress 的方法(正在运行程序的那台机器)
InetAddress address = InetAddress.getLocalHost();
InetAddress 内部方法
InetAddress 类还拥有大量你可以调用的其它方法。例如:你可以通过调用getAddress()方法来获取 IP 地址的 byte 数组。如果要了解更多的方法,最简单的方式就是读 JavaDoc 文档中关于 InetAddress 类的部分。

常用方法:
方法摘要
byte[] getAddress()
返回此 InetAddress 对象的原始 IP 地址。
static InetAddress[] getAllByName(String host)
在给定主机名的情况下,根据系统上配置的名称服务返回其 IP 地址所组成的数组。
static InetAddress getByAddress(byte[] addr)
在给定原始 IP 地址的情况下,返回 InetAddress 对象。
static InetAddress getByAddress(String host, byte[] addr)
根据提供的主机名和 IP 地址创建 InetAddress。
static InetAddress getByName(String host)
在给定主机名的情况下确定主机的 IP 地址。
String getCanonicalHostName()
获取此 IP 地址的完全限定域名。
String getHostAddress()
返回 IP 地址字符串(以文本表现形式)。
String getHostName()
获取此 IP 地址的主机名。
static InetAddress getLocalHost()
返回本地主机。
boolean isAnyLocalAddress()
检查 InetAddress 是否是通配符地址的实用例行程序。
boolean isLinkLocalAddress()
检查 InetAddress 是否是链接本地地址的实用例行程序。
boolean isLoopbackAddress()
检查 InetAddress 是否是回送地址的实用例行程序。
boolean isMCGlobal()
检查多播地址是否具有全局域的实用例行程序。
boolean isMCLinkLocal()
检查多播地址是否具有链接范围的实用例行程序。
boolean isMCNodeLocal()
检查多播地址是否具有节点范围的实用例行程序。
boolean isMCOrgLocal()
检查多播地址是否具有组织范围的实用例行程序。
boolean isMCSiteLocal()
检查多播地址是否具有站点范围的实用例行程序。
boolean isMulticastAddress()
检查 InetAddress 是否是 IP 多播地址的实用例行程序。
boolean isReachable(int timeout)
测试是否可以达到该地址。
boolean isReachable(NetworkInterface netif, int ttl, int timeout)
测试是否可以达到该地址。
boolean isSiteLocalAddress()
检查 InetAddress 是否是站点本地地址的实用例行程序。














































































































































































































































javasocket通信

7.6.1Socket学习网络基础准备7.6.2基于TCP协议的Socket通信(1)7.6.3基于TCP协议的Socket通信(2)7.6.4基于UDP协议的Socket通信  查看详情

javasocket.io连接测试(代码片段)

查看详情

javasocket通讯

本来是打算验证javasocket是不是单线程操作,也就是一次只能处理一个请求,处理完之后才能继续处理下一个请求。但是在其中又发现了许多问题,在编程的时候需要十分注意,今天就拿出来跟大家分享一下。首先先建立一个服... 查看详情

javasocket学习

socket服务端编写之BIO网络学习1packagecom.example.demo.bio;23importjava.io.IOException;4importjava.net.ServerSocket;5importjava.net.Socket;67/**8*@Author:Lambert9*@Date:2019-01-0700:3710*@Description:11*/12publi 查看详情

javasocket基本使用

首先编写Client程序:1importjava.io.IOException;2importjava.net.Socket;3importjava.util.Scanner;45publicclassClient{6publicstaticvoidmain(String[]args)throwsIOException{7/**8*创建Socket9*接收服务器端发送数据10*/11Sockets 查看详情

javasocket

https://droidyue.com/blog/2015/03/08/sockets-programming-in-java/https://my.oschina.net/leejun2005/blog/104955https://www.cnblogs.com/w-wfy/p/6415840.html进程间通信需要一对套接字(socket),通过一个进程的socket与另一个进程的socke 查看详情

javasocket编程学习笔记

 1.Socket通信简介及模型  JavaSocket可实现客户端--服务器间的双向实时通信。java.net包中定义的两个类socket和ServerSocket,分别用来实现双向连接的client和server端。2.Socket通信实现方法 2.1 服务器端(非多线程)   用... 查看详情

javasocket编程学习笔记

在上一篇中,使用了javaSocket+Tcp/IP 协议来实现应用程序或客户端--服务器间的实时双向通信,本篇中,将使用UDP协议来实现Socket的通信。1.关于UDP  UDP协议(用户数据报协议)是无连接的、不可靠的、无序的,速度快,进行... 查看详情

javasocket基于tcp/ip协议

Javasocket基于TCP/IP协议应用多线程服务器原理:1、         服务器端创建serversocket并绑定要监听的端口号,循环调用serversoket的accept()方法,等待客户端的连接请求2、       &... 查看详情

javasocket可配置简易通讯器

写了个简单的小玩意可以进行简单的配置,C/S模式分别都有配置文件https://github.com/lisztomania-Zero/Config_Socket 查看详情

javasocket可配置简易通讯器

写了个简单的小玩意可以进行简单的配置,C/S模式分别都有配置文件https://github.com/lisztomania-Zero/Config_Socket 查看详情

javasocket编程--聊天小案例

  很久以前写过socket聊天室,都快忘完了,心血来潮又重新写一遍。服务器端:packagecom.fancy;importjava.io.BufferedReader;importjava.io.IOException;importjava.io.InputStream;importjava.io.InputStreamReader;importjava.io.OutputStream;imp 查看详情

javasocket通信

原理:1.基于TCP协议,建立稳定连接的点对点的通信 a.实时,快速,安全性高,占用系统资源多,效率低2.请求-响应模式 a.客户端       在网络通讯中,第一次主动发起通讯的程序被称作客户端(Cl... 查看详情

javasocket通信实现私聊群聊

   前言  闲言少叙,上代码!   代码编写   server服务端/***服务端*/publicclassServer{privatestaticServerSocketserver=null;privatestaticSocketss=null;/***客户端集合*/privatestaticMap<String,ServerThread>serve 查看详情

javasocket

转载自并发编程网–ifeve.com本文链接地址:Java网络教程之SocketJava网络教程-基础 Java提供了非常易用的网络API,调用这些API我们可以很方便的通过建立TCP/IP或UDP套接字,在网络之间进行相互通信,其中TCP要比UDP更加常用,但在本教... 查看详情

javasocket—网络连接(代码片段)

JavaSocket—网络连接1.概念网络上的两个程序通过一个双向的通信连接实现数据的交换,这个双向链路的一端称为一个Socket。Socket也就是套接字,可以用来实现不同虚拟机或者不同计算机之间的通信。在Java语言中,Socke... 查看详情

javasocket编程

申明:本文摘自:http://www.cnblogs.com/rocomp/p/4790340.htmlJava最初是作为网络编程语言出现的,其对网络提供了高度的支持,使得客户端和服务器的沟通变成了现实,而在网络编程中,使用最多的就是Socket。像大家熟悉的QQ、MSN都使用... 查看详情

javasocket不允许摆动框架出现

嘿所有我不知道为什么这样做。如果我只是运行服务器和独立客户端它就可以了。但是,一旦我将代码用于客户端,它似乎就会卡住......staticJTextFieldtextField=null;staticJTextAreamessageArea=null;staticStringserverAddress="localhost";staticUFTtrackwindo... 查看详情