首页 > 其他分享 >简易socket通信代码

简易socket通信代码

时间:2023-09-23 11:33:22浏览次数:29  
标签:java socket 代码 简易 new catch import public

 

源代码

1,服务端

package socket.ab;

import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.ArrayList;
import java.util.List;

public class Server {
	//创建集合对象
	public static List<MyChannel> list=new ArrayList<MyChannel>();
	public static void main(String[] args) {
		try {
			System.out.println("服务器开始运行");
			ServerSocket serverSocket=new ServerSocket(8080);
			while(true) {
				Socket socket=serverSocket.accept();//接收客户请求
				
				//一个客户机与服务器通信
				//new Thread(new Listen(socket)).start();
				//new Thread(new Send(socket)).start();
				
				//服务器用于交换消息,创建线程类对象
				MyChannel channel=new MyChannel(socket);
				//添加到集合
				list.add(channel);
				if(list != null) {
					System.out.println("服务器收到"+channel+"连接");
				}
				
				new Thread(channel).start();
				
			}
		} catch (IOException e) {
			// TODO 自动生成的 catch 块
			e.printStackTrace();
		}
	}
}

  2,集合对象

package socket.ab;

import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.net.Socket;
import java.util.List;

public class MyChannel implements Runnable{
	private Socket socket;
	private boolean flag=true;
	private ObjectInputStream ois;
	private ObjectOutputStream oos;
	//初始化
	public MyChannel(Socket socket){
		this.socket=socket;
		try {
			ois=new ObjectInputStream(socket.getInputStream());//获取输入流
			oos=new ObjectOutputStream(socket.getOutputStream());//获取输出流
		} catch (IOException e) {
			// TODO 自动生成的 catch 块
			e.printStackTrace();
			flag=false;
			try {
				socket.close();
			} catch (IOException e1) {
				// TODO 自动生成的 catch 块
				e1.printStackTrace();
			}
		}
	}
	//接收数据方法
	private String receive(){
		String str="";
		try {
			str=ois.readUTF();
			if(str.equals("我是心跳包")) {
				System.out.println(str);
			}
		} catch (IOException e) {
			System.out.println("断开连接");
			flag=false;
			try {
				socket.close();
			} catch (IOException e1) {
				Server.list.remove(this);
			}
		}
		return str;
	}
	//发送数据方法
	private void send(String str) {
		if(str!=null&&str.length()!=0) {
			if(!str.equals("我是心跳包")) {
				try {
					oos.writeUTF(str);
					oos.flush();
				} catch (IOException e) {
					flag=false;
					try {
						socket.close();
//						Server.list.remove(this);
					} catch (IOException e1) {
//						Server.list.remove(this);
					}
				}
			}
		}
	}
	//转发
	private void sendOther() {
		String str=this.receive();
		List<MyChannel> list=Server.list;
		if(list.size()>1) {
			for(MyChannel other :list) {
				if(other==this) {
					continue;//不发给自己
				}
				other.send(str);
			}
		}
	}
	@Override
	public void run() {
		// TODO 自动生成的方法存根
		while(flag) {
			//this.send(receive());
			sendOther();
		}
	}

}

  3,send方法

package socket.ab;

import java.io.IOException;
import java.io.ObjectOutputStream;
import java.net.Socket;
import java.util.Scanner;

public class Send implements Runnable{
	private Socket socket;
	private ObjectOutputStream oos;
	public static String name="";
	Send(Socket socket,String name,ObjectOutputStream oos){
		this.socket=socket;
		Send.name=name;
		this.oos=oos;
	}
	String str="";
	@Override
	public void run() {
		// TODO 自动生成的方法存根
		try {
			while(true) {
					Thread.sleep(1000);
					oos.writeUTF(Frame.text);
					oos.flush();
					Frame.text="";
			}
		} catch (IOException | InterruptedException e) {
			System.out.println("发送失败");
		}
	}
	
}

  4,listen方法

package socket.ab;

import java.io.IOException;
import java.io.ObjectInputStream;
import java.net.Socket;

public class Listen implements Runnable{
	private Socket socket;
	//初始化
	Listen(Socket socket){
		this.socket=socket;
	}
	@Override
	public void run() {
		// TODO 自动生成的方法存根
		try {
			//获取输入流
			ObjectInputStream ois=new ObjectInputStream(socket.getInputStream());
			while(true) {
				String read=ois.readUTF();
				Frame.jtx.append(Frame.date()+"\n"+"收到"+read+"\n");
//				System.out.println("收到"+ois.readUTF());
			}
		} catch (IOException e) {
			System.out.println("接收失败");
			Client.connet_state=false;
			Client.reconnet();
		}finally {
			try {
				socket.close();
			} catch (IOException e) {
				// TODO 自动生成的 catch 块
				e.printStackTrace();
			}
		}
	}
}

  5,客户端

package socket.ab;

import java.io.IOException;
import java.io.ObjectOutputStream;
import java.net.Socket;
import java.net.UnknownHostException;

public class Client {
	private static Socket socket;
	private static ObjectOutputStream oos;
	public static boolean connet_state=false;
	public static String name=Frame.tit;
//	static String[] arrays=new String[5];
	
	public static void main(String[] args) {
		new Frame();
		System.out.println(name+"连接到服务器");
		connet();
		if(connet_state) {
			try {
				oos=new ObjectOutputStream(socket.getOutputStream());
				new Thread(new Listen(getSocket())).start();
				new Thread(new Send(getSocket(),name,oos)).start();
				new Thread(new HeartBeat(getSocket(),oos)).start();
			} catch (IOException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}
	}
	private static void connet() {
		try {
			setSocket(new Socket("127.0.0.1",8080));
			connet_state=true;
		} catch (UnknownHostException e) {
			// TODO 自动生成的 catch 块
			e.printStackTrace();
			connet_state=false;
		} catch (IOException e) {
			// TODO 自动生成的 catch 块
			e.printStackTrace();
			connet_state=false;
		}
	}
	public static void reconnet() {
		while(!connet_state) {
			System.out.println("尝试重新连接...");	
			try {
				connet();
				Thread.sleep(5000);
			} catch (InterruptedException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}
		if(connet_state) {
			try {
				oos=new ObjectOutputStream(socket.getOutputStream());
				new Thread(new Listen(getSocket())).start();
				new Thread(new Send(getSocket(),name,oos)).start();
				new Thread(new HeartBeat(getSocket(),oos)).start();
				System.out.println("重连成功");
			} catch (IOException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}
	}
	public static Socket getSocket() {
		return socket;
	}
	public static void setSocket(Socket socket) {
		Client.socket = socket;
	}
}

  6,界面显示

package socket.ab;

import java.awt.BorderLayout;
import java.awt.Button;
import java.awt.FlowLayout;
import java.awt.Panel;
import java.awt.TextField;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Random;

import javax.swing.JScrollPane;
import javax.swing.JTextArea;
import javax.swing.ScrollPaneConstants;

public class Frame extends java.awt.Frame implements Runnable{
	public static JTextArea jtx=new JTextArea(200,150);
	public static TextField tf=new TextField(30);
	public Frame() {
		initFrame();
		initEventListner();
	}
	public static String text="";
	public static String tit="用户"+new Random().nextInt(900)+100;
	public static String tit2=tit;
//	public static String getTit() {
//		return tit;
//	}
	public static boolean sendflag=true;
//	public static String getText() {
//		return text;
//	}
	private void initFrame() {
		setTitle(tit);
		setSize(600, 500);
		setLocation(new Random().nextInt(500)+100, new Random().nextInt(900)+100);
		setResizable(false);
		Panel p=new Panel();
		
		setLayout(new BorderLayout());
		//滚动条
		JScrollPane j=new JScrollPane();
		j.setHorizontalScrollBarPolicy(ScrollPaneConstants.HORIZONTAL_SCROLLBAR_ALWAYS);
		j.setVerticalScrollBarPolicy(ScrollPaneConstants.VERTICAL_SCROLLBAR_ALWAYS);
//		JTextArea jtx=new JTextArea(200,150);
		jtx.setFocusable(false);
		j.setViewportView(jtx);
		add(j,BorderLayout.CENTER);
		p.setLayout(new FlowLayout());
		add(p,BorderLayout.SOUTH);
		
		Button btn=new Button("发送");
		
		tf.requestFocus();
		p.add(tf);
		p.add(btn);
		btn.addActionListener(new ActionListener() {
			
			@Override
			public void actionPerformed(ActionEvent e) {
				// TODO 自动生成的方法存根
//				if(text!=null && !text.trim().equals("")) {
					text=Send.name+":"+tf.getText();
					jtx.append(date()+"\n");
					jtx.append("我发送了:"+tf.getText()+"\n");
					sendflag=true;
					tf.setText("");
//				}
			}
		});
		
		setVisible(true);
		repaint();
		
	}
	public static String date() {
		Date time=new Date();
		SimpleDateFormat format=new SimpleDateFormat("dd-MM-yyyy HH:mm:ss");
		return "----------"+format.format(time);
		
	}
	private void initEventListner() {        
		addWindowListener(new WindowAdapter() {
			public void windowClosing(WindowEvent e) {
                System.exit(0);
           }
        });
    }
	@Override
	public void run() {
		// TODO 自动生成的方法存根
		new Frame();

	}
}

  7,心跳包测试

package socket.ab;

import java.io.IOException;
import java.io.ObjectOutputStream;
import java.net.Socket;

public class HeartBeat implements Runnable{
	private Socket socket;
	private ObjectOutputStream oos;
	public static String heart="我是心跳包";
	public HeartBeat(Socket socket,ObjectOutputStream oos){
		this.socket=socket;
		this.oos=oos;
	}
	
	@Override
	public void run() {
		// TODO Auto-generated method stub
		System.out.println("心跳包线程已启动...");
		try {
			while(true) {
				Thread.sleep(5000);
				oos.writeUTF(heart);
//				oos.flush();
			}
			
		} catch (InterruptedException | IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
			Client.connet_state=false;
			Client.reconnet();
		}
	}

}

  

 

标签:java,socket,代码,简易,new,catch,import,public
From: https://www.cnblogs.com/gentle-man/p/17724064.html

相关文章

  • 在jupyter notebook实现代码自动提示
    为什么代码自动提示很重要?在使用JupyterNotebook编写代码时,代码自动提示是一项非常有用的功能。它可以帮助你快速找到函数、方法和变量的名称,提高了代码的编写效率,同时减少了潜在的拼写和语法错误。效果如下:本篇博客将介绍如何在JupyterNotebook中启用和使用代码自动提示功能......
  • 代码随想录算法训练营day17 | ● 110.平衡二叉树 ● 257. 二叉树的所有路径 ● 404.
    110.平衡二叉树classSolution{public:intgetHeight(TreeNode*node){if(node==NULL)return0;intleftHeight=getHeight(node->left);if(leftHeight==-1)return-1;intrightHeigh......
  • 如何在没有第三方.NET库源码的情况,调试第三库代码?
    大家好,我是沙漠尽头的狼。本方首发于Dotnet9,介绍使用dnSpy调试第三方.NET库源码,行文目录:安装dnSpy编写示例程序调试示例程序调试.NET库原生方法总结1.安装dnSpydnSpy是一款功能强大的.NET程序反编译工具,可以对.NET程序进行反编译,代替库文档的功能,代码丢失或者损坏可直......
  • 将Winform窗体程序缩到System tray的示例代码
    网上有很多将Winform窗体缩到Systemtray的示例,但多数不好用.这里是一个简单示例,使用了Visualstudio自带的NotifyIcon控件和一个快捷菜单contextMenuStrip控件.增加一个contextMenuStrip控件,新增两个菜单项:显示界面和退出系统.增加一个NotifyIcon控件,设置它......
  • 假设 a 是一个由线程 1 和线程 2 共享的初始值为 0 的全局变量,则线程 1 和线程 2 同时
    假设a是一个由线程1和线程2共享的初始值为0的全局变量,则线程1和线程2同时执行下面的代码,最终a的结果不可能是()booleanisOdd=false;for(inti=1;i<=2;++i){if(i%2==1)isOdd=true;elseisOdd=false;a+=i*(isOdd?1:-1);}A:-1B:-2C:0D:1......
  • nginx代理websocket请求原理 理解记录
    最近遇见一个问题,在OpenEuler操作系统上,如果不主动开放端口白名单的话,就无法访问该端口。然后我部署了一个服务,端口是5200。在这台机器上部署了一个nginx,通过nginx80端口反向代理5200端口。然后再OpenEuler上开放80端口。此时本地访问80端口,登录后正常的http请求都没问题。......
  • cmake添加 版本到代码中
    CMakeLists.txt:add_definitions(-DSYSMONITER_VER="${VER}")c++代码:voiddisplayVersion(){#ifdefSYSMONITER_VERstd::cout<<SYSMONITER_VER<<std::endl;#endif}编译命令:cmake..-DVER=$(date"+%Y%m%d%H%M%S")这里的date用......
  • 9.22(代码测试)
    CalculateN.java1importjava.math.BigInteger;2importjava.util.Scanner;345publicclassCalculateN{67/**8*@paramargs9*/10publicstaticvoidmain(String[]args){11System.out.print("������N��&......
  • 关于表单快速开发低代码技术平台的内容介绍
    运用什么样的表单快速开发软件平台可以实现高效率创收?随着科技的进步和飞速发展,专业的低代码技术平台已经走入了很多企业的办公职场中,它们灵活、轻量级、优质、高效、易维护等优势特点,可以高效助力广大企业提质增效,并且利用数据资源,实现流程化办公。什么是低代码技术平台?其实,低代......
  • 软件开发中,如何为你的代码构建三层防护体系
    本文分享自华为云社区《构建DevSecOps中的代码三层防护体系》,作者:Uncle_Tom。在DevSecOps的应用过程中,静态分析工具在开发阶段承担着非常重要的代码质量和安全的看护任务。本文根据开发过程的不同位置的开发环境、代码特征以及检测工具能力的差异,提出了需要因地制宜地部署检查工......