`
陈雨璇
  • 浏览: 18117 次
  • 性别: Icon_minigender_2
  • 来自: 衡阳
最近访客 更多访客>>
社区版块
存档分类
最新评论

通信小结

阅读更多
寒假在蓝杰呆了有半个月,年前一周,年后一周。算是寒假集训吧,学习了关于通信方面的一些内容。
总结的说,通信可以分为两个部分,一是服务器,一是客户端。

一、服务器
总结来说两句代码:
//创建一个服务器
ServerSocket server = new ServerSocket (服务器端口);
//在等待客户机连结进入,进入后,生成一个Socket对象
Socket client = server.accept();

然后从Socket对象上得到相应的输入输出流即可。

二、客户端
只需要一句代码:
       
        //创建一个客户端
	Socket client=new Socket (“服务器IP”,服务器端口);

同样从Socket对象上得到相应的输入输出流。

若要进行信息传输,则加上相应的传输和处理消息的方法即可。可应用InputStream和OutputStream的write() 和read() 方法,将消息转换成Byte型的,再进行传输。
下面是一个简单的传送消息的程序。
首先是服务器端的代码:

public void setServer(int port){
		try{
			ServerSocket server = new ServerSocket(port);
			System.out.println("服务器创建成功!"+port);
			while(true){
				Socket client = server.accept();
				//创建一个线程对象传入时进入的连结
				st = new ServerThread(client,jtf);
				st.start();
				System.out.println("已经启动了一个线程去处理对象了。");
			}
		}catch(Exception e){
			e.printStackTrace();
		}
	}

服务器发消息时有开一个线程,所以定义一个线程类:
public class ServerThread extends Thread{

	private Socket client;
	private OutputStream out;//输出流对象
	public JTextField text;
	public String msg;
	
	public ServerThread(Socket sc,JTextField text){
		client = sc;
		this.text = text;
	}
	
	//将发送消息的代码包装到一个方法中
	public void sendMsg(String msg)throws Exception{
		byte[] data = msg.getBytes();
		//发送对象,并强制输出
		out.write(data);
		out.flush();
	}
	//重写run方法
	public void run(){
		processMsg(client);
		//执行方法后,线程自己退出。
	}
	
	//处理连接对象
	public void processMsg(Socket client){
		try{
			out = client.getOutputStream();
			InputStream ins = client.getInputStream();
			String s = "welcome to 服务器\r\n";
			this.sendMsg(s);
			String ints = readString(ins);
			while (!ints.equals("bye")){
				//System.out.println("客户机说:"+ints);
				System.out.println(s);
				msg = "服务器说:"+text.getText()+"\r\n";
				this.sendMsg(msg);//发送字符串给客户机对象
				//再次获取字符串字节
				ints = readString(ins);
			}
			s = "come back again!!!\n";
			this.sendMsg(s);
			client.close();//关闭客户端
		}catch(Exception ef){
			ef.printStackTrace();
		}
	}
	/**
	 * 从输入流中读取字节,组成字符串返回
	 * 字节=13时,表明之前的是一个字符串
	 * @param ins
	 * @return 从流上读到的字符串
	 */
	public String readString(InputStream ins) throws Exception{
		//创建一个字符串的缓冲区
		StringBuffer stb = new StringBuffer();
		char c = 0;
		while (c!=13){
			int i = ins.read();//读取客户机发来的字节
			c = (char)i;
			stb.append(c);
		}
		//将读到的字节转换成字符串
		String ints = stb.toString().trim();
		return ints;
	}
}


然后是客户端的代码,从客户端中输入消息:
public class Sampleclient extends Thread{
	
	private String IP;//客户机的IP
	private int port;//客户机的端口
	private OutputStream ous;//输出到服务器的输出流
	private BufferedReader br;//输入到服务器的输入流
	
	//创建客户机对象时,需要传入服务器的IP和端口
	public Sampleclient(String IP,int port) {
		this.IP = IP;
		this.port = port;
	}

	//首先,连结服务器
	public void connectServer(){
		try {
			//创建一个到服务器端的Socket对象
			Socket client = new Socket (this.IP,this.port);
			InputStream ins = client.getInputStream();
			ous = client.getOutputStream();
			//继续读取字符串,很多遍了。
			br = new BufferedReader(new InputStreamReader(ins));
			String input = br.readLine();
			System.out.println("服务器说: "+input);
			ous.flush();
		}catch (Exception e) {
			e.printStackTrace();
		}
	}
	
	//重写run方法,线程中读取服务器发来的消息
	public void run(){
		while(true){
			readFromServer();
		}
	} 
	
	//从线程中读取消息,这个方法会阻塞,必须在独立线程中
	public void readFromServer(){
		try {
			String input = br.readLine();
			System.out.println("服务器说: "+input);
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
	
	//发送一条消息到服务器的方法
	public void sendMsg(String msg){
		try{
			msg+="\r\n";
			this.ous.write(msg.getBytes());
			this.ous.flush();
		}catch(Exception ef){
			ef.printStackTrace();
		}
	}
	
	//程序启动主函数
	public static void main(String[] args) {
		Sampleclient ct = new Sampleclient("localhost",8080);
		ct.connectServer();//连结服务器成功
			//创建一个从命令行读取用户输入的扫描器对象
		Scanner sc=new Scanner(System.in);
		ct.start();//启动读取线程
		while(true){//继续读取命令行输入发给服务器
			System.out.println("输入要发送的消息:");
			String msg=sc.next();
			System.out.println("客户端说: "+msg);
			ct.sendMsg(msg);
		}
	}
}


这段代码运行时还有一些小瑕疵,各位看了不要直接Copy,要稍作修改。
分享到:
评论

相关推荐

    Java Socket通信小结

    Java Socket通信小结 在Java编程中,Socket通信是一种基于TCP/IP协议的网络通信方式,它允许两个应用程序之间建立可靠的、双向的数据传输连接。本文将深入探讨Java Socket通信的基础知识,以及如何通过Java实现一个...

    关于CP1H变频器通信小结.pdf

    【CP1H变频器通信小结】 本文主要围绕CP1H变频器与Modbus-RTU通信的配置和特点进行阐述。CP1H变频器是三菱电机推出的一款可编程控制器,它具备串口通信功能,可以与其他设备通过Modbus-RTU协议进行数据交换。 **...

    linux下Qt通信小结.pdf

    在Linux环境下进行Qt应用程序开发时,串口通信是一项常见的需求。Qt本身虽然没有提供专门的串口通信类,但可以通过QIODevice抽象层与其他系统接口进行交互。本文将总结作者在Linux下使用Qt进行串口通信的经验,探讨...

    进程通讯总结及测试

    进程间的通信(IPC,Inter-Process Communication)是操作系统中一种重要的功能,允许不同进程之间交换信息,协同工作。本文将重点讨论其中的共享内存方式。 共享内存是一种高效的数据交换机制,它允许多个进程共享...

    通信实训小结.pdf

    "通信实训小结" 通信实训小结是指在通信领域中的实习或实践活动,本文档记录了某个实习生的两周实习经历,包括了实习的内容、收获的知识、以及未来努力的方向。 一、通信实训内容 通信实训的内容涵盖了多个方面,...

    基于SIMATIC S7-300/400 服务器软件包的IEC61850通信规约快速入门

    #### 4 “IEC61850ServerLibrary“软件包通信小结 通过以上步骤,我们可以成功地将SIMATIC S7-300 PLC配置为IEC61850服务器,并通过“IEC61850ServerLibrary”软件包实现了与基于IEC61850标准的其他设备之间的通信...

    通信广场营业员精编工作小结.rar

    通信广场营业员精编工作小结.rar

    中级通信专业实务传输与接入教程章节小结

    《通信专业实务:传输与接入》是一本针对全国通信专业技术人员职业水平考试的教程,它涵盖了有线和无线传输与接入的重要技术。该书旨在帮助考生掌握通信领域的核心概念和实际应用。 首先,书中详细讲解了有线传输与...

    Delphi Socket 通信编程要点小结

    ### Delphi Socket 通信编程要点小结 #### 一、引言 在现代通信系统开发过程中,基于Delphi的Socket编程技术因其高效性与灵活性而备受青睐。本文将结合实践经验,对Delphi环境下进行Socket通信时所遇到的关键问题...

    通信广场营业员精编工作小结.pdf

    标题中的“通信广场营业员精编工作小结”暗示了这份文档主要涵盖了通信广场营业员的工作总结和经验分享,这通常涉及到与客户服务、销售技巧、业务处理效率以及个人职业素养等相关的内容。描述中提到的“展示企业形象...

    现代通信技术实验报告(程控,移动通信)

    现代通信技术报告,关于程控交换机和移动通信切换

    现代通信系统原理网络教材_

    本章知识点小结 第二章 信道与噪声 2.1 信道的基本概念 2.2 恒参信道及其对所传信 号的影响 2.3 随参信道及其对所传信 号的影响 2.4 信道的加性噪声 2.5 通信中的常见噪声 2.6 信道...

    2019年通信广场营业员个人小结.doc

    【通信广场营业员职责与挑战】 作为一名通信广场的营业员,我深知自己的职责不仅仅是销售通信产品和服务,更是代表企业形象,展现"移动人"的专业素养和热情态度。我们的工作是与客户面对面交流的"窗口",是连接企业...

    实验一 进程通信——管道和信号实验报告.doc

    本次实验是关于操作系统中的进程通信,主要涉及了进程的创建、控制、以及多种通信方式,包括信号通信和管道通信。通过实验,目的是加深对进程概念的理解,掌握并发执行的本质,并学习如何解决进程间的互斥问题。实验...

    移动通信原理.pdf

    介绍移动通信原理,供广大通信专业人员学习

    移动通信重点总结.doc

    第二代移动通信系统 --- 2G:数字系统 基本特征:数字技术、数字处理电路SIM卡,手机体积小质量轻、 大容量,TDMA/FDD, CDMA/FDD; 主流标准:GSM,NADC(IS-136),PDC(TDMA); IS-95(CDMA) ; 第三代移动通信系统 -...

Global site tag (gtag.js) - Google Analytics