基础通讯

通讯总结

第一:通讯的意义

1.通讯是指:两台电脑之间或者同一台电脑不同程序之间的信息沟通


第二:通讯实现
1.IP

首先要实现通讯就必须了解每台电脑都有一个IP地址,所以我们传递
的信息就可以通过指定传递的IP准确的传到指定位置。如果是同一台电
脑上的程序之间的通讯,就可以使用“localhost”来指定本机IP地址。

2.端口

我们还得知道每台电脑上有65535个端口,每个端口有一个端口号0-65535,
每个端口可以给一个程序通讯使用,一旦这个端口正在使用别的程序就不
能再使用它了。其中的前1000个端口为系统占用,所以一般是用端口号大
于1000的端口。

3.服务器与客户机

通讯中相互连接传递信息的程序之间一个称为服务器,另一个称为客户机。
其中服务器和客户机的区分在于最初时被呼叫的是服务器,主动去呼叫的
是客户机。想象一下我们打电话,主动拨通的手机就是一个客户机,而被
呼叫的就是服务器。但是一旦通讯接通,服务器与客户机的分别就不再有
意义。其中我们用
服务器:
int port;//端口号
java.net.SeverSocket sever=new java.net.SeverSocket(port);
来创建一个绑定在端口port上的服务器对象sever。
当一个服务器对象创建后就应该让它等待着,一旦有客户机接入就实现下一
步具体的通讯内容。
//让服务器等待的做法是:
java.net.Socket client=sever.accept();
程序在执行到此处是会出现滞留即是一直在这个地方,当有客户机接入后就
可以执行在这一行代码后的代码内容了……
客户机:
String IP="……";//要连接的服务器的IP号
int port=…… ;//客户机自己的端口号
java.net.Socket client=new java.net.Socket(IP,port);

4.信息的传递

建立好服务器和客户机后就到了信息的传递了,在计算机的内部信息是以字节传递的。
在这一步我们会用到输入输出流的知识。其实所谓的通讯就是将一个计算机的所要表
的东西在另一个计算机上完整地表达出来或者在同一个计算机上的两个程序之间表达。

每个java.net.Socket 类的对象都能通过:

OutputStream out=client.getOutputStream();//得到输出流
InputStream ins=client.getInputStream();//得到输入流
得到相应的输出输入流;然后就是服务器和客户机分别把自己要表达的信息写入输出流,
从输入流上读取对方所表达的信息;

5.协议

初步的服务器和客户机上的协议其实就是规定好写入的信息和读取的信息的关系;即是
规定好怎样写出,怎样读取以达到读取到信息可以表达写出前的原本意义;
例如:
写出时是:
int a=1;
int b=2;
int c=3;
out.write(a);
out.write(b);
out.write(c);
读取时就应该是:
int a=ins.read();
int b=ins.read();
int c=ins.read();
System.out.println("a= "+a+" b= "+b+" c= "+c);
a=1 b=2 c=3
这样我们就可以得到写出前a b c所表达的意思
如果我们不是按照这个顺序读取,那么我们就得不到写出前意思;这这就是最简单的
协议。当然这么简单的协议是无法满足我们的通讯需要的,我们还得根据需要去定义
更好的协议。

6.线程

我们的客户机和服务器一旦接通,信息的交流就是不断地进行而又不失连续的,通讯
的内容是在不断的增加和变化的,所以我们得需要用线程来实现信息的读取和写入。

7.界面

如果我们想要自己写的通讯能够被别人使用,那我们就得造出一个可视化的界面供用户
使用。

第三:通讯的例子

生活中我们常见的通讯例子:手机,聊天软件,视频软件等等。

简单通讯的实现

1.服务器类
public class Sever{
//port:服务器所在计算机的一个端口
int port;
pulbic Sever(port){
this.port=port;
A(port);
}
//
public void A(int port){
//创建一个服务器对象
java.net.SeverSocket sever=new java.net.SeverSocket(port);
//得到等待器
java.net.Socket client=sever.accept();
//输入输出流
OutputStream out;
OutputStream ins
//实例化一个服务器写线程
SeverThread st=new SeverWriteThread(out);
st.start();
//实例化一个服务器读线程
SeverReadThread rt=new SeverReadThread(ins);
rt.start();
}
}

2.服务器写出线程类
public class SeverWriteThread extends Thread{
//输入输出流
OutputStream out;
//构造方法:将等待器传过来已得到输出与输入流
public SeverWriteThread(OutputStream out){
this.out=out;
}
//入口
public void run(){
while(true){
//调用写的方法
write(out);
//释放CUP;
try{Thread.sleep(100);}catch(Exception ef){ef.printStackTrace();}
}
}
//写出的方法
public void write(OutputStream out){
//要写的内容可根据自己的需要不断加入
int a=1;
int b=2;
int c=3;
out.write(a);
out.write(b);
out.write(c);
}
}

3.服务器读取线程类

public class SeverReadThread extends Thread{
//输入输出流
InputStream ins;
//构造方法:将等待器传过来已得到输出与输入流
public SeverReadThread(InputStream ins){
this.ins=ins;
}
//入口
public void run(){
while(true){
//调用写的方法
read(ins);
//释放CUP;
try{Thread.sleep(100);}catch(Exception ef){ef.printStackTrace();}
}
}
//读取的方法
public void read(InputStream ins){
//按照写的方式读取:当然这个方式应该是客户机里写出的格式,即是协议
int a=ins.read();
int b=ins.read();
int c=ins.read();
}
}

4.客户机

1.客户机类
public class Customer{
//客户机将要去连接的服务器的IP地址
String IP;
//port:服务器所在计算机的一个端口;
int port;
pulbic Customer(String IP,int port){
this.IP=IP;
this.port=port;
A(IP,port);
}
//
public void A(String IP,int port){
//得到等待器
java.net.Socket client=sever.accept(IP,port);
//输入输出流
OutputStream out;
OutputStream ins
//实例化一个服务器写线程
CustomerWriteThread st=new CustomerWriteThread(out);
st.start();
//实例化一个服务器读线程
CustomerReadThread rt=new CustomerReadThread (ins);
rt.start();
}
}

2客户机写出线程类
public class CustomerWriteThread extends Thread{
//输入输出流
OutputStream out;
//构造方法:将等待器传过来已得到输出与输入流
public CustomerWriteThread (OutputStream out){
this.out=out;
}
//入口
public void run(){
while(true){
//调用写的方法
write(out);
//释放CUP;
try{Thread.sleep(100);}catch(Exception ef){ef.printStackTrace();}
}
}
//写出的方法
public void write(OutputStream out){
//要写的内容可根据自己的需要不断加入
int a=1;
int b=2;
int c=3;
out.write(a);
out.write(b);
out.write(c);
}
}
3.客户机读取线程
public class CustomerReadThread Thread{
//输出流
InputStream ins;
//构造方法:将等待器传过来已得到输出与输入流
public CustomerReadThread (InputStream ins){
this.ins=ins;
}
//入口
public void run(){
while(true){
//调用读的方法
read(ins);
//释放CUP;
try{Thread.sleep(100);}catch(Exception ef){ef.printStackTrace();}
}
}
//读取的方法
public void read(InputStream ins){
//按照写的方式读取:当然这个方式应该是服务器里写出的格式,即是协议
int a=ins.read();
int b=ins.read();
int c=ins.read();
}
}

猜你喜欢

转载自nimeidekao.iteye.com/blog/1612983