黑马程序员-网络通信
来源:互联网 发布: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后),如果再继续写数据则抛出该异常。前两个异常的解决方法是首先确保程序退出前关闭所有的网络连接,其次是要检测对方的关闭连接操作,发现对方关闭连接后自己也要关闭该连接。
- 黑马程序员-网络通信
- 黑马程序员-----网络通信
- "黑马程序员"Java网络通信
- 黑马程序员_Socket网络通信
- 黑马程序员—day24网络通信
- 黑马程序员---多线程和网络通信
- 黑马程序员——网络通信
- 黑马程序员 tcp /UTP网络通信
- 黑马程序员-----网络通信(第七篇)
- 黑马程序员——网络通信
- 黑马程序员——网络通信
- 黑马程序员 网络编程之网络通信三要素
- 黑马程序员——Java 网络通信 正则表达式
- 【黑马程序员】网络通信机制和Socket的简单了解
- 黑马程序员_网络编程-笔记遗漏TCP通信
- 黑马程序员——Java基础--- 网络通信
- 黑马程序员——Java之网络通信
- 黑马程序员_Socket通信
- Mac HomeBrew 安装
- 5.1比赛总结加解题报告
- UVA 11384 Help is needed for Dexter
- Special equations
- Delphi的线程类
- 黑马程序员-网络通信
- mac中安装python, pydev, beautifulsoup, lxml, scrapy
- iOS-UITableviewCell的重用机制
- UVALive 3357 Pinary
- STL容器默认的内存分配器(std::alloc)
- 【wamp+zendFramework】zendFramework基本配置环境详细步骤
- Exynos4412 Android4.4 平台 WiFi 功能移植 第一篇
- Android 回顾Service之Service基础使用
- 文件读取