通信的简单实现
物理上的一台电脑有很多端口,[每个端口都可以起到服务端或客户端的作用,所以在建立客户端是要选择哪一个端
口,当在自己的电脑上面运行一个服务端程序是,本台主机就是服务器,当我们用CMD命令行
时,如果用的命令是telnet 127.0.0.1 XXXX(指端口号),相当于服务器连接的主机客户端是本台主机,这是,我们运行程序的这台主机就充当了服务器和客户端两个角色,如果ip地址的位置改为其他的,则该ip地址代表的那台主机就代表客户端,例如,telnet 198.168.1.120 XXXX,那么现在我的主机就只充当服务器,而由198.168.1.120这台主机充当客户端。
Socket可以看成在两个程序进行通讯连接中的一个端点,一个程序将一段信息写入Socket中,该Socket将这段信息发送给另外一个Socket中,使这段信息能传送到其他程序中。
套接字相当于一个媒介,用来在服务器和客户端之间转送信息。那么,服务器要能接收从客户端发来的消息的话,的有一个这样的一个服务器套接字对象 ServerSocket ss,处理异常,创建之后,服务器就处于等待状态,等待有数据输入过来。
通信,其最核心的东西不过是服务器和客户端之间消息的发送,对每一方都有两种情况,消息的输入和输出,所以得有输入流和输出流对象(InputStream和OutputStream)。
服务器给客户端发送的消息
消息是一个字符串,输出流写[/size]这条消息时事一个个字节写出去的,所以先把要输出的字符串放在一个字节数组里存储再写。例如
String s="中国";
byte[] bs=s.getBytes();
out.write(bs);
客户端给服务器发送消息,服务器在接收消息是也是只能一个字节一个字节的读取,所以首先要有一个对象接收读取得此消息t,建立一个缓冲数组来暂存读了的字节,等到整条消息都读完后在一起转为字符串输出;但是,有怎么样判断一条消息是否已经读完呢,所以,我们可以设置一个结束标志,当计算机读到该标志时就结束读取工作,代码如下:
//以本台主机位服务器,要读取客户端发来的消息的话,要建立一个对象接收读出来的消息
int t=ins.read();
//若需要将读进去的字符串输出来,可用一个缓冲数组存放,当一条消息读完之后再把给消息以字符串的形式转出来
java.lang.StringBuffer str=new java.lang.StringBuffer();
//对于一条消息总该有个结束的标志,我们一遇到#结束,故用一个循环
while(t!='#'){
System.out.println("the char is"+t);
//接着读取下一个字节
t=ins.read();
//把字节打印出来
str.append((char)t);
}
//把字节转换成字符串打印
String ims=str.toString();
System.out.println("the message is:"+ims);
(3)全部代码
package tx2014713;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.Socket;
//简单的客户端
/**
*
* @author liuli
* @port 电脑上的某个端口,需要自己指定
*/
public class Sever {
//客户端中的一个执行任务的函数,在主函数中调用,物理上的一台电脑有好很多端口,
//每个端口都可以起到服务端或客户端的作用,所以在建立客户端是要选择哪一个端口
public void setup(int Port){
//接下来就到通信的入点,建立服务器套接字,并指定服务器端口
try {
ServerSocket ss=new ServerSocket(Port);
System.out.println("你访问的端口是:"+Port);
//此时服务器处于阻塞状态,在等待客户端的访问
//当有客户端访问了之后,服务器的等待方法结束,返回一个代表与客户端连接的对象
while(true){ //服务器进入循环等待状态,即当一个客户端访问完了之后,服务器不会随之而关闭
Socket socket=ss.accept();
//建立套接字对象之后,服务器要和客户端交换信息的话,需要建立输入输出流
InputStream ins=socket.getInputStream();
OutputStream out= socket.getOutputStream();
//服务器要发送给客户端的一串字符串
String s="丽丽";
//计算机在读消息是不能直接读取字符串而是一个一个的字节读,所以先把字符串读到一个字节数组中存放起来
byte[] bb=s.getBytes();
//通过输出流对象将字节数组的内容写出去
//out.write(bb);
out.write(s.getBytes("GBk"));
//以本台主机位服务器,要读取客户端发来的消息的话,要建立一个对象接收读出来的消息
int t=ins.read();
//若需要将读进去的字符串输出来,可用一个缓冲数组存放,当一条消息读完之后再把给消息以字符串的形式转出来
java.lang.StringBuffer str=new java.lang.StringBuffer();
//对于一条消息总该有个结束的标志,我们一遇到#结束,故用一个循环
while(t!='#'){
System.out.println("the char is"+t);
//接着读取下一个字节
t=ins.read();
//把字节打印出来
str.append((char)t);
}
//把字节转换成字符串打印
String ims=str.toString();
System.out.println("the message is:"+ims);
}
} catch (IOException e) {
e.printStackTrace();
}
}
public static void main(String[] args) {
Sever se=new Sever();
se.setup(5678);
}
分享到:
相关推荐
Android中socket通信简单实现 socket通信需要有一个服务器和客户端,可以把同一个APP作为服务器跟客户端,也可以分开成两个APP。 先上个图: 这里以一个APP作为服务器跟客户端为示例 1、添加网络访问权限 2、写...
spcomm+delphi串口通信简单实现二台电脑串口通信
Java串口通信简单实现二台电脑串口通信 利用了 comm控件 源代码
Hello, 这是一个MFC UDP通信示例,好用,网上整理,侵权请通知在下删除。谢谢
一个简单的socket通信服务实现,包括客户端和服务端,简单易懂 !
基于socket简单通信协议实现 基于socket简单通信协议实现
三菱FX5U与西门子S7-1200通过简单CPU通信设置实现以太网通信功能的具体方法步骤 三菱FX5U 西门子S7-1200 以太网通信
LabVIEW通信,原理是一个服务端,一个发送端,一个读取端,需要配置datasocker manager 里面的数据接口,源代码需要稍做修改,要根据每个人计算机的IP地址来.
三菱FX5U系列PLC通过简单CPU通信功能实现以太网通信的具体方法示例
利用socket实现客户端与服务器之间的简单通信,快速熟悉掌握三次握手与四次挥手。。。
python实现的简单加密通信,采用pycrypto加密模块实现
"基于TCP协议的简单即时通信软件的设计与实现" 本文主要介绍了基于TCP协议的简单即时通信软件的设计与实现,旨在设计一个能够处理多用户进行实时、安全的即时通信系统。本系统采用C/S模式,服务器负责客户端的登录...
基于TCP协议的简单即时通信软件的设计与实现(含源文件).pdf基于TCP协议的简单即时通信软件的设计与实现(含源文件).pdf基于TCP协议的简单即时通信软件的设计与实现(含源文件).pdf基于TCP协议的简单即时通信软件的设计...
这是一个通过C#网络socket功能,通过CIP协议实现AB,欧姆龙NJ/NX系列PLC简单标签(不包括数组结构体联合体)读写的例子,希望给研究CIP协议通信采集PLC数据的同学一个参考。
环境:Ubuntu16.04 Qt简单实现Tcp通信 服务器+客户端程序
S7-1200与三菱FX5U系列PLC通过简单CPU通信功能实现以太网通信的具体方法
基于环信的简单通信的实现
2个窗口分别模拟服务器端和客户端,基于TCP协议的socket通信,实现互相通信