java sender_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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,我可以为您提供一个基本的WFQ算法实现,包括sender.py,router.py和receiver.py。请注意,这只是一个简单的示例,您需要根据您的具体需求进行修改和优化。 sender.py: ```python import socket import time def main(): # 创建socket send_sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) # 发送数据 while True: data = "hello world" send_sock.sendto(data.encode(), ("127.0.0.1", 9999)) time.sleep(0.1) if __name__ == '__main__': main() ``` router.py: ```python import socket import threading import queue def wfq(queue_list, weight_list): """ WFQ算法 :param queue_list: 队列列表 :param weight_list: 权重列表 :return: 返回被选中的队列索引 """ min_weight = min(weight_list) index_list = [i for i, j in enumerate(weight_list) if j == min_weight] min_len = float("inf") selected_index = -1 for index in index_list: if len(queue_list[index]) < min_len: min_len = len(queue_list[index]) selected_index = index return selected_index def receiver(recv_sock, queue_list, weight_list): """ 接收数据并进行WFQ :param recv_sock: 接收端socket :param queue_list: 队列列表 :param weight_list: 权重列表 """ while True: data, addr = recv_sock.recvfrom(1024) index = wfq(queue_list, weight_list) queue_list[index].put((data, addr)) def sender(send_sock, queue_list): """ 发送数据 :param send_sock: 发送端socket :param queue_list: 队列列表 """ while True: for queue in queue_list: if not queue.empty(): data, addr = queue.get() send_sock.sendto(data, addr) def main(): # 创建socket recv_sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) recv_sock.bind(("127.0.0.1", 9999)) send_sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) # 创建队列 queue_list = [queue.Queue() for i in range(3)] # 设置权重 weight_list = [1, 2, 3] # 启动接收线程 recv_thread = threading.Thread(target=receiver, args=(recv_sock, queue_list, weight_list)) recv_thread.start() # 启动发送线程 send_thread = threading.Thread(target=sender, args=(send_sock, queue_list)) send_thread.start() if __name__ == '__main__': main() ``` receiver.py: ```python import socket def main(): # 创建socket recv_sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) recv_sock.bind(("127.0.0.1", 9999)) # 接收数据 while True: data, addr = recv_sock.recvfrom(1024) print(data.decode()) if __name__ == '__main__': main() ``` 在这个例子中,sender.py发送数据到router.py,router.py根据权重进行WFQ并将数据发送到receiver.py。您可以根据需要修改权重或添加更多队列。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值