`
huanggaole
  • 浏览: 10484 次
  • 性别: Icon_minigender_1
最近访客 更多访客>>
社区版块
存档分类
最新评论

通信总结

阅读更多
一.常用的网络命令
ping——用来查看网络是否通畅,不能用来证明主机上是否开放了某个端口
telnet——如果网络通畅,可以用telnet命令连接对方的端口,如果能连接上,证明对方端口打开。
netstat——打印出电脑与其他服务器建立的TCP连接或UDP连接信息。

二.网络通信的基本原理
服务器与客户端的通信
主要实现方法
第一步,创建服务器
ServerSocket server = new ServerSocket(端口号);
第二步,等待其他客户机来连接
java.net.Socket client = server.accept();
注:调用server.accept()方法会阻塞程序。
第三步,从Socket连接对象上调用方法得到输入输出流
java.net.Socket client = server.accept();
OutputStream out = client.getOutputStream();
InputStream ins = client.getInputStream();
第四步,使用输入输出流对象进行数据的读写
String s="汉字charactor123\n\r";
byte[] data=s.getBytes();
  out.write(data);
  out.flush();
client.close();
将上述代码整合就可以得到一个基础的通信程序。
但是这个服务器只能用来等待一个客户端的连接,一旦客户机连接上来收到服务器发出的一条消息后服务器就退出了。而事实上我们的服务器是一对多的持续处理数据。为了实现服务器的持续等待新的客户机接入,我们可以将accept方法放入一个循环中:
第五步,设定服务器顺循环等待
while(true){
    Socket client=server.accept();
    }
第六步,读取字符
通过in=ins.read()语句可以将一个字符读取到in变量中,要注意这个字符是原字符在服务器端先转化成字节,然后将字节信息通过信道传到客户端,客户端将字节转型成字符型得到的字符。每次只能读一个,为了能够循环读取服务器发来的字符,可以使用while语句。例如:
while(in!=13){
    in=ins.read();
    System.out.println(in);
}
当服务器发来的不是回车时,客户机可以源源不断地接收服务器发来的字节。
第七步,读取字符串
上一步中实现客户机了一个个字符的读取,但是在很多情况下,我们的信息不是以一个一个的字节为单位发送的,倘若我们要读取的是一整个字符串(一次性读取很多个字节),可以定义这样一个函数:
private String readString(InputStream ins) throws Exception{
    StringBuffer str=new StringBuffer();
    char c=0;
    while(c!=13){
    int i=ins.read();
    c=(char)i;
    stb.append(c);
    }
    String inputS=stb.toString().trim();//这个函数用来去掉字符串尾部的空格
    return inputS;
}
这样,当我们需要客户机接收一个字符串的时候,可以调用这个函数,例如:
    String inputS=readString(ins);
    while(!inputS.equals("bye")){
        data=s.getBytes();
        out.write(data);
        out.flush();
        inputS=readString(ins);
    }
这段代码的意思是不断地通过readString函数读取客户端那边发来的字符串,如果字符串不为"bye"那么就不断循环读取。
通过上述的知识,一个可以进行字符串通信的服务器客户机就可以实现了。
但是现在的通信程序依然是一对一的,即一个服务器同一时刻只能跟一个客户端通信,而现实生活中的服务器如果一个时刻只能跟一个客户端通信显然太无效率。要实现一对多的服务,我们需要进行多线程服务器的改造。
第八步,多线程服务器
其实只需要将每个客户端节点放入服务器的一个线程就可以,请参考以下代码
public class ServerThread extends Thread{
    private Socket client;     //线程对象要处理的连接变量
    private OutputStream out;  //输出流对象
    public ServerThread(Socket sc){    
    //传入一个要处理的连接对象,即每个线程均含有一个主要的客户端
       this.client = sc;
    }
    public void run(){
       processChat(this.client);//对客户端的操作都写在这个函数里
    }
}
然后在服务器创建客户端节点的时候把创建的节点传入一个新的线程并启动这个线程就可以了
ServerThread st=new ServerThread(client);
st.start();
这样,一个像模像样的多线程服务器就能实现了

在这个过程中我们需要注意的问题有:
1.从服务器到客户端与从客户端到服务器发送与接收信息的方法是完全相同的,即只要建立了连接之后,知道了从服务器向客户端发送信息的方法,同样的原理就可以写出从客户端到服务器发送消息的代码。
2.如果按照上述提供的方法进行字符串传输时,不能正常传输汉字。因为每个汉字由两个字节组成,在发送数据时,我们把汉字化成了两个字节,接收后又把每个字节转换成了相应的字符,相当于把原来的一个汉字转换成了两个字符,显示出来的是乱码。比较好的解决办法是用DataInputSteam与DataOutputStream把信息按照数据类型的方式发送接收与还原。但是底层的实现依然是通过字符的传递来实现的。
3.目前我们的通信程序只能传递字符串。如果改用DataInputStream DataOutputStream可以传送整数或其他基本数据类型。如何实现多种数字类型的传递?这需要我们设计自己的传送格式,例如在信息前事先发送信息的大小、信息的类型等信息,而接受的时候每次也先对接收到的头几位格式进行分析判断进行不同的操作。只要发送端与接收端信息格式一直保持一直,就能实现多种类型信息的传输。
4.我比较讨厌通信的主要原因是,通信是即画图板的保存、哈弗曼压缩后有一个跟位运算关系密切的课程。位运算很不直观,只要位对不齐或者长度出现问题就会出现各种错误。通信阶段极容易出现字符数量或者格式错误的情况,在文件传输的时候要慎重。
5.关于多人聊天。要用到队列哦,即将所有客户端的线程放到一个队列里,每当服务器收到一条消息,就将这条消息发给所有的客户端。
分享到:
评论

相关推荐

    光纤通信总结

    ### 光纤通信总结 #### 一、光纤通信概述 光纤通信是一种先进的通信技术,它利用光纤作为传输介质,通过光波携带信息进行数据传输。相比于传统的金属导线,光纤通信具有诸多优势,如传输距离远、抗干扰能力强等。 ...

    [020]VC++串口通信总结.zip上位机开发VC串口学习资料源码下载

    [020]VC++串口通信总结.zip上位机开发VC串口学习资料源码下载[020]VC++串口通信总结.zip上位机开发VC串口学习资料源码下载[020]VC++串口通信总结.zip上位机开发VC串口学习资料源码下载[020]VC++串口通信总结.zip...

    移动通信总结新版.pdf

    移动通信总结新版.pdf 移动通信技术在当今世界中扮演着非常重要的角色,随着移动通信技术的发展,人们的生活水平和工作效率都得到了极大的改善。在这个移动通信总结新版中,我们将详细介绍移动通信技术的发展历史、...

    C#通信总结 含管道通信的代码

    具体到代码实现,压缩包中的"C#通信总结 含管道通信的代码"可能包含示例项目或源代码,展示了以上提到的.NET Remoting、WinAPI调用和管道通信的实际应用。通过学习这些代码,你可以深入了解每个方法的细节,包括如何...

    施耐德AT310变频器与S7-1200 Modbus RTU通信总结.pdf

    总结来说,施耐德AT310变频器与西门子S7-1200 PLC通过Modbus RTU通信,需要精确配置双方的通信参数,并注意地址的对应关系。同时,理解并熟练掌握PLC的编程技巧,对于成功实现通信至关重要。在实际操作中,不断试验...

    VC串口通信总结

    ### VC串口通信总结 #### 一、串口通信概述 串口通信是计算机与外部设备之间进行数据交换的一种常见方式。随着技术的发展,虽然USB和以太网等其他通信方式逐渐普及,但在某些特定场景下,特别是工业控制领域,串口...

    C#管道通信总结的实例及文档代码

    本资源“C#管道通信总结的实例及文档代码”提供了一个关于C#管道通信的详细教程,这对于理解进程间通信(IPC,Inter-Process Communication)至关重要。 管道通信是一种在不同进程之间交换数据的有效方式,它允许...

    常用串口通信总结.

    常用一些通信总结,如CAN 485 RS232 SPI SCI I2C

    短距离无线通信总结.doc

    短距离无线通信总结.doc

    串行通信总结

    ### 串行通信总结 #### 一、串行通信技术概述 ##### 1.1 概念 串行通信作为一种常见的数据传输方式,在现代通信领域扮演着重要角色。相较于并行通信,串行通信通过单一的数据线进行数据的逐位传输,每位数据占据...

    操作系统进程间通信总结

    别人自己写的总结,内容是常用进程间通信方法及函数

    [详细完整版]移动通信总结.doc

    移动通信是现代通信技术的重要组成部分,它涉及到在移动设备之间或移动设备与固定点之间的信息传输。移动通信的核心特点是利用无线电波在复杂环境中的传播,同时处理有限的频谱资源和日益增长的业务需求。根据工作...

    西门子各种通信总结

    这些设备间的通信是实现自动化系统高效运行的关键。本文将深入探讨西门子产品之间的通信方式和协议,帮助读者理解和掌握相关知识点。 1. **S7-300与S7-200通信** - **MPI通信**:MPI(Multi Point Interface)是一...

    TCP异步通信试验

    总结来说,这个实验涵盖了TCP通信基础、MFC中的套接字编程以及异步通信模式的应用,通过服务端和客户端的互动,实现文本字符串的实时传输。这样的实践有助于开发者深入理解网络编程,特别是TCP通信的异步特性,提升...

    串口通信项目总结

    串口通信项目总结 本篇资源的主要内容是对多串口接收项目的总结,涵盖技术总结和心得总结两方面。下面将对标题、描述、标签和部分内容进行详细的解释和总结。 一、技术总结 技术总结是对整个项目的技术实现过程的...

    移动通信总结3.docx

    移动通信的要点总结涵盖了多个方面。信息通过无线电波传播,面临传播损耗和用户移动造成的多普勒频移等问题。干扰环境复杂,包括内部和外部干扰,以及各种类型的干扰效应。网络管理任务繁重,如用户管理和计费。频谱...

    51单片机与PC通信总结

    51单片机的串口,是个全双工的串口,发送数据的同时,还可以接收数据。 当串行发送完毕后,将在标志位 TI 置 1,同样,当收到了数据后,也会在 RI 置 1。

    android_Service通信总结

    这是一个关于Service与Activity通信的部分代码,及如何使用Service和Activity通信。

    移动通信期末总结.doc

    移动通信是现代通信技术的重要组成部分,它涉及到许多关键概念和技术,包括信令、移动通信、接入信令、网络信令以及各种多址接入技术。在移动通信中,信令是控制通信过程的关键,分为接入信令(如移动台与基站之间的...

Global site tag (gtag.js) - Google Analytics