通信,实际上就是服务器与客户端之间的数据交互,其中的所有过程都是把传出与得到的数据进行处理二进行其他操作。因此,除了这部分之外,最关键的部分就是通信协议了。通信协议,贫僧认为它就好比两者之间所共同遵守的规定,它告诉了参与通信的机器传输数据以及读取数据的方式
服务器代码(含有多线程内容)
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通信是一种基于TCP/IP协议的网络通信方式,它允许两个应用程序之间建立可靠的、双向的数据传输连接。本文将深入探讨Java Socket通信的基础知识,以及如何通过Java实现一个...
【CP1H变频器通信小结】 本文主要围绕CP1H变频器与Modbus-RTU通信的配置和特点进行阐述。CP1H变频器是三菱电机推出的一款可编程控制器,它具备串口通信功能,可以与其他设备通过Modbus-RTU协议进行数据交换。 **...
在Linux环境下进行Qt应用程序开发时,串口通信是一项常见的需求。Qt本身虽然没有提供专门的串口通信类,但可以通过QIODevice抽象层与其他系统接口进行交互。本文将总结作者在Linux下使用Qt进行串口通信的经验,探讨...
进程间的通信(IPC,Inter-Process Communication)是操作系统中一种重要的功能,允许不同进程之间交换信息,协同工作。本文将重点讨论其中的共享内存方式。 共享内存是一种高效的数据交换机制,它允许多个进程共享...
"通信实训小结" 通信实训小结是指在通信领域中的实习或实践活动,本文档记录了某个实习生的两周实习经历,包括了实习的内容、收获的知识、以及未来努力的方向。 一、通信实训内容 通信实训的内容涵盖了多个方面,...
#### 4 “IEC61850ServerLibrary“软件包通信小结 通过以上步骤,我们可以成功地将SIMATIC S7-300 PLC配置为IEC61850服务器,并通过“IEC61850ServerLibrary”软件包实现了与基于IEC61850标准的其他设备之间的通信...
通信广场营业员精编工作小结.rar
《通信专业实务:传输与接入》是一本针对全国通信专业技术人员职业水平考试的教程,它涵盖了有线和无线传输与接入的重要技术。该书旨在帮助考生掌握通信领域的核心概念和实际应用。 首先,书中详细讲解了有线传输与...
### Delphi Socket 通信编程要点小结 #### 一、引言 在现代通信系统开发过程中,基于Delphi的Socket编程技术因其高效性与灵活性而备受青睐。本文将结合实践经验,对Delphi环境下进行Socket通信时所遇到的关键问题...
标题中的“通信广场营业员精编工作小结”暗示了这份文档主要涵盖了通信广场营业员的工作总结和经验分享,这通常涉及到与客户服务、销售技巧、业务处理效率以及个人职业素养等相关的内容。描述中提到的“展示企业形象...
现代通信技术报告,关于程控交换机和移动通信切换
本章知识点小结 第二章 信道与噪声 2.1 信道的基本概念 2.2 恒参信道及其对所传信 号的影响 2.3 随参信道及其对所传信 号的影响 2.4 信道的加性噪声 2.5 通信中的常见噪声 2.6 信道...
【通信广场营业员职责与挑战】 作为一名通信广场的营业员,我深知自己的职责不仅仅是销售通信产品和服务,更是代表企业形象,展现"移动人"的专业素养和热情态度。我们的工作是与客户面对面交流的"窗口",是连接企业...
本次实验是关于操作系统中的进程通信,主要涉及了进程的创建、控制、以及多种通信方式,包括信号通信和管道通信。通过实验,目的是加深对进程概念的理解,掌握并发执行的本质,并学习如何解决进程间的互斥问题。实验...
介绍移动通信原理,供广大通信专业人员学习
第二代移动通信系统 --- 2G:数字系统 基本特征:数字技术、数字处理电路SIM卡,手机体积小质量轻、 大容量,TDMA/FDD, CDMA/FDD; 主流标准:GSM,NADC(IS-136),PDC(TDMA); IS-95(CDMA) ; 第三代移动通信系统 -...