黑马程序员-网络通信

来源:互联网 发布:iptv网络电视频道 编辑:程序博客网 时间:2024/05/01 10:24

  • ------- <a href="http://www.itheima.com" target="blank">android培训</a>、<a href="http://www.itheima.com" target="blank">java培训</a>、期待与您交流! ----------
  • 网络通信要素:

在java中网络程序有两种协议:TCP和UDP,TCP通过握手协议进行可靠的连接,UDP则是不可靠连接。

IP地址:用于标记一台计算机的身份证。

IP地址由网络地址(确定网络)和主机地址(网络中的主机)组成。

子网掩码:为了区分网络地址和主机地址。

IP地址分为A类地址、B类地址、C类地址(常用)、D类地址、E类地址。

127.0.0.1(localhost)是本机地址。

IPV4和IPV6

IPV4使用4个十进制数表示,即32位二进制。

telnet用于连接远程计算机或者因特网计算机提供的服务。每个服务都会设定一个端口。

给出类似     telnet ip    port    即可和特定的服务进行通信

如果要连接因特网的服务,不仅要给出端口,还要给出计算机的名称,只有给出IP地址和端口号时,才能够请求服务,并接收到应答。


  • Socket (TCP):

Socket是一个用于机器之间通信的类。

1.Socket客户端:

(1)Socket s = new Socket(ip,port);打开一个套接字,发送请求    

(2)InputStream istream = s.getInputStream();接收数据

(3)OutputStream ostream  = s.getOutputStream();发送数据

需要用PrintWriter和Scanner进行包装,并且注意PrintWriter的自动缓冲。

2.Socket服务器:注意多个客户端同时访问服务器的问题:多线程

(1)ServerSocket server = new ServerSocket(port);创建一个端口

(2)Socket s = server.accept();        只有当有客户端请求并连接,函数才会返回

(3)InputStream istream = s.getInputStream();接收数据

(4)OutputStream ostream  = s.getOutputStream();发送数据

需要用PrintWriter和Scanner进行包装,并且注意PrintWriter的自动缓冲。


  • TCP协议传输


TCP---传输控制协议,提供的是面向连接、可靠的字节流服务。

当客户和服务器彼此交换数据前,必须先在双方之间建立一个TCP连接,之后才能传输数据。

TCP提供超时重发,丢弃重复数据,检验数据,流量控制等功能,保证数据能从一端传到另一端。


class TcpKehuduan 
{
public static void main(String[] args) throws Exception
{
//创建客户端的Socket服务,指定主机和端口信息
Socket s = new Socket("192.168.0.100",10000);


//为了发送数据,要获取到Socket中的输出流
OutputStream os = s.getOutputStream();
os.write("你好啊".getBytes());

//关闭资源
os.close();
}
}


class TcpFuwuduan
{
public static void main(String[] args)throws Exception
{
//建立服务端Socket服务,并且监听一个端口
ServerSocket ss = new ServerSocket(10000);

//通过accept方法,获取客户端对象
Socket s = ss.accept();
String ip = s.getInetAddress().getHostAddress();
System.out.println(ip);


//要获取客户端发过来的数据,那么就要使用客户端的读取流来读取数据
InputStream is = s.getInputStream();


byte[] buy = new byte[1024];
int len = is.read(buy);
System.out.println(new String(buy,0,len));


//关闭客户端
s.close();
ss.close();
}
}

上面就是tcp网络传输的最基本格式


  • UDP协议传输

UDP---用户数据报协议,是一个简单的面向数据报的运输层协议。

UDP不提供可靠性,它只是把应用程序传给IP层的数据报发送出去,但是并不能保证它们能到达目的地。

由于UDP在传输数据报前不用在客户和服务器之间建立一个连接,且没有超时重发等机制,故而传输速度很快

class UdpSend 
{
public static void main(String[] args) throws Exception
{
//创建udp服务,通过DatagramSocket服务
DatagramSocket ds = new DatagramSocket(1314);


//确定数据,封装成数据包
byte[] buf = "hello!".getBytes();
DatagramPacket dp = new DatagramPacket(buf,buf.length,InetAddress.getByName("192.168.0.100"),2000);
//通过Socket服务把数据发送出去
ds.send(dp);
//关闭资源
ds.close();
}
}


class UdpReceive
{
public static void main(String[] args)throws Exception
{
//创建一个UdpSocket,建立接受端
DatagramSocket ds = new DatagramSocket(2000);
//定义一个数据包,用于储存数据
byte[] buy = new byte[1024];
DatagramPacket dp = new DatagramPacket(buy,0,buy.length);


//通过服务的receive方法,将接收到的数据储存到数据包中
ds.receive(dp);
//通过数据包获取其中的数据
String ip = dp.getAddress().getHostAddress();//获取其ip


String data = new String(dp.getData(),0,dp.getLength());//获取数据包中的要传输的数据,因为是数组,所以要指定获取多长


int port = dp.getPort();//获取其发送端的端口号


System.out.println("我的主机ip:"+ip+"\r\n"+"我想对你说的话:"+data+"\r\n"+"我的端口号"+port);


//关闭资源
ds.close();
}
}

上面是udp传输的基本格式

  • tcp和udp的区别:

1.TCP是面向连接的传输控制协议,而UDP提供了无连接的数据报服务;
2.TCP具有高可靠性,确保传输数据的正确性,不出现丢失或乱序;UDP在传输数据前不建立连接,不对数据报进行检查与修改,无须等待对方的应答,所以会出现分组丢失、重复、乱序,应用程序需要负责传输可靠性方面的所有工作;
3.也正因为以上特征,UDP具有较好的实时性,工作效率较TCP协议高;
4.UDP段结构比TCP的段结构简单,因此网络开销也小。

  • 网络编程常见异常:

第1个异常是java.net.BindException:Address already in use: JVM_Bind。该异常发生在服务器端进行new ServerSocket(port)(port是一个0,65536的整型值)操作时。异常的原因是以为与port一样的一个端口已经被启动,并进行监听。此时用netstat –an命令,可以看到一个Listending状态的端口。只需要找一个没有被占用的端口就能解决这个问题。 

第2个异常是java.net.ConnectException: Connection refused: connect。该异常发生在客户端进行new Socket(ip, port)操作时,该异常发生的原因是或者具有ip地址的机器不能找到(也就是说从当前机器不存在到指定ip路由),或者是该ip存在,但找不到指定的端口进行监听。出现该问题,首先检查客户端的ip和port是否写错了,如果正确则从客户端ping一下服务器看是否能ping通,如果能ping通(服务服务器端把ping禁掉则需要另外的办法),则看在服务器端的监听指定端口的程序是否启动,这个肯定能解决这个问题。 

第3个异常是java.net.SocketException: Socket is closed,该异常在客户端和服务器均可能发生。异常的原因是己方主动关闭了连接后(调用了Socket的close方法)再对网络连接进行读写操作。 

第4个异常是java.net.SocketException: (Connection reset或者Connect reset by peer:Socket write error)。该异常在客户端和服务器端均有可能发生,引起该异常的原因有两个,第一个就是如果一端的Socket被关闭(或主动关闭或者因为异常退出而引起的关闭),另一端仍发送数据,发送的第一个数据包引发该异常(Connect reset by peer)。另一个是一端退出,但退出时并未关闭该连接,另一端如果在从连接中读数据则抛出该异常(Connection reset)。简单的说就是在连接断开后的读和写操作引起的。 

第5个异常是java.net.SocketException: Broken pipe。该异常在客户端和服务器均有可能发生。在第4个异常的第一种情况中(也就是抛出SocketExcepton:Connect reset by peer:Socket write error后),如果再继续写数据则抛出该异常。前两个异常的解决方法是首先确保程序退出前关闭所有的网络连接,其次是要检测对方的关闭连接操作,发现对方关闭连接后自己也要关闭该连接。 

0 0
原创粉丝点击