JAVA之网络编程

一、基础
OSI 参考模型                 TCP/IP参考模型        (软件开发常涉及到的)
应用层                          应用层  (应用程序)
表示层                          传输层  (TCP/UDP层)
会话层                          网络层  (IP层)
传输层                          物理层+数据链路层
网络层
数据链路层
物理层

数据封装:从上到下,将数据封装成为电信号
数据拆封:另一台机器接收电信号,从下到上,一层一层解释,最后接收到数据

二、TCP和UDP协议
TCP:是一种面向连接,可靠的通信协议,连接时需要三次握手  可靠但速度慢
UDP:无需建立连接,是一种不可靠的连接  不可靠但速度快

三、Socket
(1)两台机器通过socket进行通信,双向链路的一端成为socket
(2)Socket通常实现client-server连接
(3)java.net包内定义了Socket类和ServerSocket类,分别实现双向连接的client端和Server端
(4)建立连接时所需要的寻址信息为远程计算机的IP和端口号
端口号:用来区别同一机器的不同应用程序,有65536个,一般不要选1024以下,系统随时会征用
注意:TCP端口和UDP端口是分开的,每一个有65536个端口

四、TCP Socket通信模型
Server                          Client
        ServerSocket s (port)          Socket(host,port)
s.accept() /等待连接
|->Socket对象
---------------------------------------------
OutputStream                   OutputStream   对角线
InputStream                    InputStream
---------------------------------------------
Socket.close()                 Socket.close()

五、常用方法
accept():服务器端如果接收客户端请求,会生成一个新的socket,进行连接,是阻塞式的
getInputStream、getOutputStream:获得流

六、UDP
发送数据时是发送的数据包
服务端:DatagramPacket   DatagramSocket   
通过receive接收包
客户端:DatagramPacket   DatagramSocket

通过send发送包


下面分别是TCP和UDP的代码

TCP服务端

public class TestServer {
	public static void main(String[] args) {
		try {
			ServerSocket s = new ServerSocket(8888);
			while(true){
				Socket s1 = s.accept();
				DataOutputStream dos = new DataOutputStream(s1.getOutputStream());
				dos.writeUTF("hello:"+s1.getInetAddress()+"port:"+s1.getPort()+" BYEBYE");
				dos.close();
				s1.close();
			}
		} catch (IOException e) {
			e.printStackTrace();
			System.out.println("程序运行出错!!");
		}
	}
}

TCP客户端

public class TestClient {
	public static void main(String[] args) {
		try {
			Socket s = new Socket("127.0.0.1", 8888);
			DataInputStream dis = new DataInputStream(s.getInputStream());
			System.out.println(dis.readUTF());
			dis.close();
			s.close();
		} catch (UnknownHostException e) {
			e.printStackTrace();
		} catch (IOException e) {
			System.out.println("服务器连接失败!!!");
			e.printStackTrace();
		}
	}
}

UDP服务端

public class TestUDPServer {
	public static void main(String[] args) throws Exception{
		byte buf [] = new byte [1024];
		DatagramPacket dp = new DatagramPacket(buf, buf.length);
		DatagramSocket ds = new DatagramSocket(5678);
		while(true){
			ds.receive(dp);
			ByteArrayInputStream bais = new ByteArrayInputStream(buf);
			DataInputStream dis = new DataInputStream(bais);
			System.out.println(dis.readLong());
		}
	}
}

UDP客户端

public class TestUDPClient {
	public static void main(String[] args) throws Exception {
		/*long转换为字节数组*/
		ByteArrayOutputStream baos = new ByteArrayOutputStream();
		DataOutputStream dos = new DataOutputStream(baos);
		dos.writeLong(10000L);
		byte buf [] = baos.toByteArray();
		DatagramPacket dp = new DatagramPacket(buf, buf.length, new InetSocketAddress("127.0.0.1", 5678));
		DatagramSocket ds = new DatagramSocket(9999);
		ds.send(dp);
		ds.close();
	}
}





  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值