java socket对应的是网络协议中的tcp,tcp的三次握手、四次挥手、11中状态什么的这里就不说了,不知道大家平常使用socket的时候如果不注意的情况下,会不会遇到各种异常报错。
例如:
java.net.SocketException:socket is closed
错误提示的出现场景:
自己主动关闭了socket,但是之后还从里面读写数据
Software caused connection abort: socket write error
错误提示的出现场景:
对方已经关闭socket,依旧向对方写数据
connection reset (by peer)
错误提示出现的场景:
一端socket被关闭,另一端仍然发送数据,发送的第一个数据包 connection reset by peer
一端socket退出,退出时为关闭连接,另一端读数据 connection reset
所以在使用socket时,需要约定好双方读写完成的条件,然后关闭输入输出流:
socket.shutdownInput();
socket.shutdownOutput();
即当一方写入完成后,调用shutdownOutput关闭输出流,这时候对方的read方法就会返回-1,这时候对方就知道你写完了,对方可以关闭输入流,然后等待对方写入完成调用shutdownOutput后己方再调用shutdownInput,双方就正常关闭了输入输出流,这时候socket就不会出现异常了。
下面是一个socket交互的例子:
server端
public class OioServer {
public static void main(String[] args) throws IOException {
ServerSocket serverSocket = new ServerSocket(8080);
while (true) {
Socket socket = serverSocket.accept();
System.out.println("socket = " + socket);
new Thread(() -> {
try {
InputStream in = socket.getInputStream();
OutputStream out = socket.getOutputStream();
out.write("hello! I get your message that is follow".getBytes(Charset.forName("UTF-8")));
byte[] buf = new byte[1024];
int len;
while ((len = in.read(buf)) != -1) {
System.out.print(new String(buf, 0, len, Charset.forName("UTF-8")));
out.write(buf, 0, len);
out.write("\n end \n".getBytes(Charset.forName("UTF-8")));
out.flush();
socket.shutdownInput();
socket.shutdownOutput();
} catch (IOException e) {
e.printStackTrace();
}finally {
try {
socket.close();
} catch (IOException e) {
e.printStackTrace();
}).start();
client端
public class OioClient {
public static void main(String[] args) throws IOException {
Socket socket = new Socket("127.0.0.1", 8080);
InputStream in = socket.getInputStream();
new Thread(() -> {
BufferedInputStream bufferIn = new BufferedInputStream(in);
byte[] buf = new byte[1024];
try {
int len;
while ((len = bufferIn.read(buf)) != -1) {
System.out.print(new String(buf, 0, len, Charset.forName("UTF-8")));
}catch (Exception e) {
e.printStackTrace();
try {
socket.shutdownInput();
socket.close();
} catch (IOException e) {
e.printStackTrace();
}).start();
OutputStream out = socket.getOutputStream();
int cout = 10;
while (cout-- > 0) {
out.write(("this time is " + System.currentTimeMillis() + "\n").getBytes("UTF-8"));
socket.shutdownOutput();
java socket对应的是网络协议中的tcp,tcp的三次握手、四次挥手、11中状态什么的这里就不说了,不知道大家平常使用socket的时候如果不注意的情况下,会不会遇到各种异常报错。例如:java.net.SocketException:socket is closed错误提示的出现场景:自己主动关闭了socket,但是之后还从里面读写数据Software caused conn...
1.客户端进程发出连接释放报文,并且停止发送数据。释放数据报文首部,FIN=1,其序列号为seq=u(等于前面已经传送过来的数据的最后一个字节的序号加1),此时,客户端进入FIN-WAIT-1(终止等待1)状态。 TCP规定,FIN报文段即使不携带数据,也要消耗一个序号。
2.服务器收到连接释放报文,发出确认报文,ACK=1,ack=u+1,并且带上自己的序列号seq=v,此时,服务端就...
先前的一篇博文(C语言socket编程实现TCP通信),在unix系统下,利用C语言socket编程简单实现了客户端服务端TCP通信。实际上,利用java.net包中的类可以更容易的进行socket通信。
但不管是使用java还是C语言进行socket编程,TCP通信本质上是一样的。都是服务端端绑定一个端口并对此端口进行监听,客户端根据IP和端口访问服务端,两者通过三次握手建立连接,然后就可以通...
由Socket和SocketServer创建出来的输入输出流如果关闭的话,那么socket和SocketServer也会关闭
但是有showdownInput()和showdownOutput()方法来改变流的流向
注意,关闭之后,就不能再使用该流,只能使用另外一种流,也就是如果关闭了输入流,就只能使用输出流,反之亦然
可能有小伙伴会疑惑,如果想使用一个Socket和ServerSocket进行交替输入输出操作怎么办?
socket编程是基于http的编程,一次请求就是一个socket,下一次请求就再创
socket编程过程中往往会遇到这样那样的问题,出现了这些问题,有的是由于并发访问量太大造成的,有些却是由于代码中编程不慎造成的。
比如说,最常见的错误就是程序中报打开的文件数过多这个错误。socket建立连接的时候是三次握手,这个大家都很清楚,
但是socket关闭连接的时候,需要进行四次挥手,但很多人对于这四次挥手的具体流程不清楚,吃了很多亏。
在 Java 中,如果您的 Socket 没有被正确关闭,可能会导致连接被断开。如果您不关闭 Socket,它可能会一直处于打开状态,因此可能会出现一些问题,如资源泄漏、连接过期或连接池满了等问题。
此外,如果您的代码在客户端和服务器端都没有关闭 Socket,那么它们可能会被保持在打开状态,这可能会导致资源浪费和性能问题。
为了避免这种情况,建议在使用 Socket 后始终关闭它,以确保正确释放资源并避免潜在的连接问题。可以使用以下代码关闭 Socket:
```java
socket.close();
这将关闭与 Socket 相关联的流并释放与之相关的资源。在使用 Socket 时,请确保始终在使用完毕后关闭它。