Java学习记录(网络编程)

Socket

  1. 用于创建服务器 . 创建完毕后, 会绑定一个端口号.
  2. 然后此服务器可以等待客户端连接 .
  3. 每连接一个客户端 , 服务器就会得到一个新的Socket对象, 用于跟客户端进行通信

简介

常用的的构造方法

  1. ServerSocket(int port);
    创建一个基于TCP/IP协议的服务器 , 并绑定指定的端口号.

    注意: 参数port的范围是: 0-65535 (建议1025-65535)
    (0 - 1024端口大多已经被一些知名的软件占用了)

  2. Socket(String ip,int port)
    创建一个套接字, 并连接指定ip和端口号的 服务器

    参数1. 服务器的ip地址
    参数2. 服务器软件的端口号

常用的方法

  • OutputStream getOutputStream();
    返回的是 , 指向通信的另一端点的输出流
  • InputStream getInputStream();
    返回的是 , 指向通信的另一端点的输入流
  • void close();
    关闭套接字

注意:

在网络编程时, 获取输入输出流的操作 ,对于客户端与服务器来说是相对的 
客户端的输入流, 输入的是服务器的输出流 输出的内容. 
客户端的输出流, 输出到了服务器的输入流中. 

所以 在使用时, 需要注意以下一点规则:

  • 客户端与服务器获取流的顺序必须是相反的

创建服务器端

//搭建服务器							指定端口号
ServerSocket server = new ServerSocket(55565);
//等待客户端链接
//对客户端的连接实例化
System.out.println("等待连接");        
Socket socket = server.accept();
System.out.println("连接已成功");

创建客户端

//客户端
//客户端实例对象				指定连接的地址和端口号
Socket socket = new Socket("127.0.0.1", 55565);

交流

  • 服务器端与客户端通过IO流进行交流

客户端

//客户端
Socket socket = new Socket("127.0.0.1", 55565);

//客户端接收服务器端发出的数据
InputStream is = socket.getInputStream();
BufferedReader re = new BufferedReader(new InputStreamReader(is));
String text = re.readLine();
System.out.println("收到"+text);

//客户端向服务器端发送数据
OutputStream io = socket.getOutputStream();
PrintStream ps = new PrintStream(io);
ps.println("感谢您的服务");

服务器端

Socket socket = server.accept();
System.out.println("连接已成功");

//服务器向客户端发送数据
OutputStream io = socket.getOutputStream();
PrintStream is = new PrintStream(io);
is.println("欢迎链接本服务器");

//服务器接收客户端发送的数据
InputStream is1 = socket.getInputStream();
BufferedReader re = new BufferedReader(new InputStreamReader(is1));
String text = re.readLine();
System.out.println("收到"+text);

SocketException

  1. java.net.BindException:Address already in use: JVM_Bind

    该异常发生在服务器端进行new ServerSocket(port) 或者socket.bind(SocketAddress bindpoint)操作时

    原因:与port一样的一个端口已经被启动,并进行监听。此时用netstat –an命令,可以看到一个Listending状态的端口。只需要找一个没有被占用的端口就能解决这个问题

  2. java.net.ConnectException: Connection refused: connect

    该异常发生在客户端进行new Socket(ip, port)或者socket.connect(address,timeout)操作时.

    原因:指定ip地址的机器不能找到(也就是说从当前机器不存在到指定ip路由),或者是该ip存在,但找不到指定的端口进行监听

  3. java.net.SocketException: Socket is closed

    该异常在客户端和服务器均可能发生。

    异常的原因是己方主动关闭了连接后(调用了Socket的close方法)再对网络连接进行读写操作

    不只是断开连接后在读写会抛出异常,实际上当连接的IO流关闭之后也会抛出该异常

    因为Socket是通过IO流来进行数据的交互的,所以当关闭连接的IO流之后服务器与客户端也就无法进行交互了,所以也会抛出该异常

  4. java.net.SocketException: Connection reset或者Connect reset by peer:Socket write error

    该异常在客户端和服务器端均有可能发生

    引起该异常的原因有两个:

    第一个就是假如一端的Socket被关闭(或主动关闭或者因为异常退出而引起的关闭),另一端仍发送数据,发送的第一个数据包引发该异常(Connect reset by peer)。

    另一个是一端退出,但退出时并未关闭该连接,另一端假如在从连接中读数据则抛出该异常(Connection reset)
    简单的说就是在连接断开后的读和写操作引起的。

    对于服务器,一般的原因可以认为:
    a) 服务器的并发连接数超过了其承载量,服务器会将其中一些连接主动Down掉.
    b) 在数据传输的过程中,浏览器或者接收客户端关闭了,而服务端还在向客户端发送数据。

注意:

在短连接中,服务器与客户端的一次交互应尽量只发送一份数据,发送和接收完毕后就要关闭释放所占用的资源,不要重复利用同一个链接一直发送和接收数据

你可能感兴趣的:(Java,socket,java,网络)