java实现socket:Sender.java与Receiver.java

1:Sender.java

package com.capinfotech.network;

import java.io.IOException;
import java.io.OutputStream;
import java.io.PrintWriter;
import java.net.Socket;
import java.net.UnknownHostException;

public class Sender {

 private String host = "localhost";
 private int port = 8000;
 private Socket socket;
 private static int stopWay = 1;       //结束通信的方式
 private final int NATURAL_STOP = 1;   //自然结束
 private final int SUDDEN_STOP = 2;    //突然终止程序
 private final int SOCKET_STOP = 3;    //关闭Socket,再结束程序
 private final int OUTPUT_STOP = 4;    //关闭输出流,再结束程序
 
 public Sender() throws UnknownHostException, IOException {
  socket = new Socket(host, port);
 }
 
 private PrintWriter getWriter(Socket socket) throws IOException {
  OutputStream os = socket.getOutputStream();
  PrintWriter pw = new PrintWriter(os, true);
  return pw;
 }
 
 public void send() throws IOException, InterruptedException {
  PrintWriter pw = getWriter(socket);
  for(int i = 0; i < 20; i++) {
   String msg = "hello_" + i;
   pw.println(msg);
   System.out.println("send:" + msg);
   Thread.sleep(500);
   if(i == 2) {
       if(stopWay == SUDDEN_STOP) {
     System.out.println("突然中止程序");
     System.exit(0);
    } else if(stopWay == SOCKET_STOP) {
     System.out.println("关闭socket,并终止程序");
     socket.close();
     break;
    } else if(stopWay == OUTPUT_STOP) {
     socket.shutdownOutput();
     System.out.println("关闭输出流并终止程序");
     break;
    }
   }
  }
  if(stopWay == NATURAL_STOP) {
   socket.close();
  }
 }
 
 public static void main(String[] args) throws UnknownHostException, IOException, InterruptedException {
  if(args.length > 0) {
   stopWay = Integer.parseInt(args[0]);
  }
  new Sender().send();
 }
 
}

Sender表示发送数据的客户程序,每隔500毫秒发送一行字符串,共发送20行字符串

 

2:Receiver.java

package com.capinfotech.network;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.ServerSocket;
import java.net.Socket;

public class Receiver {

 private int port = 8000;
 private ServerSocket serverSocket;
 private static int stopWay = 1;       //结束通信的方式
 private final int NATURAL_STOP = 1;   //自然结束
 private final int SUDDEN_STOP = 2;    //突然终止程序
 private final int SOCKET_STOP = 3;    //关闭Socket,再结束程序
 private final int INPUT_STOP = 4;    //关闭输出流,再结束程序
 private final int SERVERSOCKET_STOP = 5;  //关闭ServerSocket,再结束程序
 
 public Receiver() throws IOException {
  serverSocket = new ServerSocket(port);
 }
 
 private BufferedReader getReader(Socket socket) throws IOException {
  InputStream is = socket.getInputStream();
  return new BufferedReader(new InputStreamReader(is));
 }
 
 public void receive() throws IOException, InterruptedException {
  Socket socket = null;
  socket = serverSocket.accept();
  BufferedReader br = getReader(socket);
  
  for(int i = 0; i < 20; i++) {
   String msg = null;
   msg = br.readLine();
   System.out.println("receive:" + msg);
   Thread.sleep(1000);
   if(i == 2) {                            //终止程序,结束通信
    if(stopWay == SUDDEN_STOP) {
     System.out.println("突然中止程序");
     System.exit(0);
     
    } else if(stopWay == SOCKET_STOP) {
     System.out.println("关闭Socket并终止程序");
     socket.close();
     break;
     
    } else if(stopWay == INPUT_STOP) {
     System.out.println("关闭输入流并终止程序");
     socket.shutdownInput();
     break;
     
    } else if(stopWay == SERVERSOCKET_STOP) {
     System.out.println("关闭ServerSocket并终止程序");
     serverSocket.close();
     break;
    }
   }
  }
  if(stopWay == NATURAL_STOP) {
   socket.close();
   serverSocket.close();
  }
 }
 
 public static void main(String[] args) throws IOException, InterruptedException {
  if(args.length > 0) stopWay = Integer.parseInt(args[0]);
  new Receiver().receive();
 }
 
}

Receiver类表示接收数据的服务器程序,它每隔1秒钟接收一行字符串,共接收20行字符串

 

3:测试的方法

   *自然结束Server和Receiver的通信

     先运行java Receiver, 后运行java Sender

   *提前终止Receiver

     先运行java Receiver 2 或 java Receiver 3 或java Receiver 4 或java Receiver 5, 然后再运行java Sender,会发现Receiver接收了3个字符后结束运行,但是Sender依然在发送数据。

   *突然终止Sender

     先运行java Receiver,再运行java Sender 2, Sender在发送了3行字符串之后,在没有关闭socket的情况下,就结束了运行,Receiver在第四次执行BufferedReader的readLine()方法时会抛出异常

   *关闭或者半关闭Sender的Socket

   先运行java Receiver, 再运行java Sender3,或者java Sender 4,Sender在发送了3行字符串之后,会关闭socket执行(java

Sender 3),或者关闭Socket的输出(java Sender 4),然后结束运行,Receiver在第四次执行BufferedReader的readLine()方法时读到输入流的末尾,因此,readLine()方法返回null

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

波哥的技术积累

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值