`
GeassG
  • 浏览: 6068 次
  • 性别: Icon_minigender_1
社区版块
存档分类
最新评论

通信小结

 
阅读更多

通信,实际上就是服务器与客户端之间的数据交互,其中的所有过程都是把传出与得到的数据进行处理二进行其他操作。因此,除了这部分之外,最关键的部分就是通信协议了。通信协议,贫僧认为它就好比两者之间所共同遵守的规定,它告诉了参与通信的机器传输数据以及读取数据的方式

服务器代码(含有多线程内容)

 

package 通信学习;

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

public class Server {

	public static void main(String[] args) {
		Server server = new Server();
		server.buildserver(8888);
	}
	
	//开启服务器端口
	public void buildserver(int port){
		
		try {
			ServerSocket ss = new ServerSocket(port);
			
			System.out.println("连接"+port+"端口成功");
			
			while(true){
				Socket sc = ss.accept();//类似前台接待员
				
				System.out.println("客户端连接成功");
				
				ServerThread st = new ServerThread(sc);
				st.start();
			}
			
				
			
		} catch (IOException e) {
			e.printStackTrace();
		}
	}
	
	

}
package 通信学习;

import java.io.DataInputStream;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.Socket;

public class ServerThread extends Thread{
	
	private Socket sc;
	
	public ServerThread(Socket sc) {
		this.sc = sc;
	}

	//对信息的处理
	public void run(){
		try {
			OutputStream os = sc.getOutputStream();
			InputStream is = sc.getInputStream();
			
			//用DataInputStream包装
			DataInputStream dins = new DataInputStream(is);
			while(true){
				//读取消息长度
				int length = dins.readInt();
				//读取判断消息类型的标志
				byte flag = dins.readByte();
				//判断是普通聊天消息
				if(flag == 1){
					byte[] data = new byte[length-1-4];
					dins.readFully(data);
					String msg = new String(data);
					System.out.println("发送内容为"+msg);
				}
				//判断是文件传输
				else if(flag == 2){
					System.out.println("服务器准备接收文件");
					byte[] name = new byte[256];
					dins.readFully(name);
					
					//转换成字符串形式
					String filename = new String(name);
					//读取剩下的文件内容
					byte[] data = new byte[length-1-4-256];
					dins.readFully(data);
					//保存文件					
					String allFileName="E:/"+filename;
					File file = new File(allFileName.trim());
					file.createNewFile();
					FileOutputStream fops = new FileOutputStream(file);
					fops.write(data);
					fops.flush();
					fops.close();
					System.out.println("读取并保存文件成功");
				}
			}
		} catch (IOException e) {
			
			e.printStackTrace();
		}
		
	}
	

}

 用于检测的客户端(需要特别注意与服务器之间的协议)

package 客户端;

import java.io.DataOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.Socket;
import java.util.Scanner;

import javax.swing.JFrame;
import javax.swing.JTextArea;

public class Chat {
	//输出流对象全局化
	private DataOutputStream dops;
	//构建写入名字进流的方法
	public void writeName(DataOutputStream ops,String filename,int len){
		try {
			byte[] data = filename.getBytes();
			ops.write(data);
			while(len>data.length){
				ops.write('\0');
				len--;
			}
		} catch (IOException e) {
			e.printStackTrace();
		}
	}
	//构建传文件的方法
	public void sendfile(String filename){
		
		try {
			File file = new File(filename);
			FileInputStream ips = new FileInputStream(file);
			int filelength = ips.available();
			int totallength = 4+1+256+filelength;
			dops.writeInt(totallength);
			dops.writeByte(2);
			String shortfilename = file.getName().trim();
			System.out.println(shortfilename);
			writeName(dops,shortfilename,256);
			byte[] filedata = new byte[filelength];
			ips.read(filedata);
			dops.write(filedata);
			dops.flush();
		} catch (Exception e) {
			// TODO 自动生成的 catch 块
			e.printStackTrace();
		}
		
	}
	//构建聊天的方法
	public void sendmsg(String msg){
		
		try {
			byte[] str = msg.getBytes();
			int totallength = 4+1+str.length;
			dops.writeInt(totallength);
			dops.writeByte(1);
			dops.write(str);
			dops.flush();
		} catch (IOException e) {
			// TODO 自动生成的 catch 块
			e.printStackTrace();
		}
	}
	//连接到服务器的方法
	public void conn(String ip,int port){
		//添加窗口
		JFrame jf = new JFrame("Robot");	
		//设置大小
		jf.setBounds(400, 100, 500, 500);		
		//设置显示位置
		jf.setLocationRelativeTo(null);
		//设置关闭操作
		jf.setDefaultCloseOperation(3);
		//设置禁止改变大小
		jf.setResizable(false);
		//放一个对话框
		JTextArea jta = new JTextArea();
		jf.add(jta);
		//窗口可视化
		jf.setVisible(true);
		try {
			Socket client = new Socket(ip,port);//连接服务器
			InputStream ips = client.getInputStream();//得到两者之间的输入流
			OutputStream ops = client.getOutputStream();//得到两者之间的输出流

 

			//用DataOutputStream包装
			dops = new DataOutputStream(ops);
			while(true){
				if(jta.getText().indexOf("1") != -1){
					sendmsg("Hello");
					break;
				}else if(jta.getText().indexOf("2") != -1){
					System.out.println("客户端准备发送文件");
					sendfile("G:/asd.txt");
					break;
				}
			}
		
		} catch (Exception e) {
			// TODO 自动生成的 catch 块
			e.printStackTrace();
		}
	}
	//主函数
	public static void main(String[] args) {
		Chat cc = new Chat();
		cc.conn("localhost", 8888);
	}
}

 

分享到:
评论

相关推荐

    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