网络编程


IP和端口

IP地址:互联网上每台计算机都有一个唯一标示自己的标记,这个标记就是IP地址。IP地址=网络地址+主机地址,IP地址分IPv4和IPv6两类,因为现在世界上计算机越来越多,IPv4已经满足不了那么多的计算机了,于是就出现了IPv6. JAVA可以获取自己的IP地址也可以根据网址获取远程IP,例如:
import java.net.InetAddress;
import java.net.UnknownHostException;

public class IPTest {
	public static void main(String[] args) throws UnknownHostException {
		InetAddress ip = InetAddress.getLocalHost();
		System.out.println(ip.getHostAddress());
		ip = InetAddress.getByName("www.baidu.com");
		System.out.println(ip.getHostAddress());
	}
}

运行结果为:
192.168.1.5
220.181.112.143

端口:用于标识进程的逻辑地址,不同进程的标识,端口号的范围是0~65535,其中0~1024系统使用或保留端口。

TCP和UDP

TCP和UDP都是传输层的协议,TCP协议是可靠的传输协议,传输前会采用“三次握手”的方式建立连接,以保证传输的可靠性。而UDP协议是不可靠的传输协议,即发送出的数据不一定接受的到,网上的聊天工具一般采用UDP协议。
UDP:
1.将数据和及源和目的地封装成数据包,不需要建立连接
2.每个数据包的大小控制在64K以内
3.因为是无连接的,所以不可靠
4.不需建立连接速度快
TCP:
1.建立连接形成传输数据的通道
2.在连接中进行大量数据传输
3.通过三次握手完成连接,是可靠协议
4.必须建立连接,效率稍低

UDP发送接收数据

发送端代码:
public class UDPSend {
	public static void main(String[] args) throws Exception {
		DatagramSocket ds = new DatagramSocket();//创建套接字
		String str = "测试信息";//要发送的信息
		byte[] b = str.getBytes();//将要发送的信息转换成byte
		DatagramPacket dp = new DatagramPacket(b, b.length, InetAddress.getByName("localhost"),3000);//定义发送包,包含要发送的地址和端口号
		System.out.println("正在发送信息...");
		ds.send(dp);//发送
		System.out.println("发送信息完成");
		ds.close();
	}
}

接收端代码:
public class UDPReceive {

	public static void main(String[] args) throws Exception {
		DatagramSocket ds = new DatagramSocket(3000);//接收同样需要套接字
		byte[] b = new byte[1024];//定义接收缓存大小
		DatagramPacket dp = new DatagramPacket(b,b.length);//接收的数据也要放入数据包中
		System.out.println("正在接收信息...");
		ds.receive(dp);//会一直接收信息
		System.out.println(dp.getAddress()+":"+dp.getPort()+" "+new String(b, 0,dp.getData().length));
		System.out.println("接收信息完成");
		ds.close();
	}
}

运行结果为:
启动接收端之后显示
正在接收信息...
这时运行发送端,运行后显示
正在发送信息...
发送信息完成
接收端会收到,发送端发来的信息:
正在接收信息...
/127.0.0.1:54004 测试信息
接收信息完成

TCP发送接收数据

TCP传输分为客户端和服务端,客户端使用的套接字是Socket,服务端使用的套接字是ServerSocket,因为TCP是可靠协议,所以TCP在发送数据的时候会经历以下几个步骤
1,建立服务端的socket服务, ServerSocket(),并监听一个端口。
2,获取连接过来的客户端对象。通过ServerSokcet的 accept方法。没有连接就会等,此方法将阻塞程序。
3,客户端如果发送或者接收数据,那么服务端要使用对应的客户端对象,获取到该客户端对象的读取流来读取发过来的数据或者使用该对象获取输出流进行数据发送,并打印在控制台。
4,关闭服务端和客户端。
服务器端代码:
public class TCPServer {

	public static void main(String[] args) throws Exception {
		ServerSocket server = new ServerSocket(3000);
		System.out.println("服务器运行,等待客户端连接");
		Socket client = server.accept();
		String str = "hello world";
		PrintStream ps = new PrintStream(client.getOutputStream());
		ps.println(str);
		server.close();
		client.close();
		ps.close();
	}
}

客户端代码:
public class TCPClient {

	public static void main(String[] args) throws Exception {
		Socket client = new Socket("localhost", 3000);
		BufferedReader br = new BufferedReader(new InputStreamReader(client.getInputStream()));
		String str = br.readLine();
		System.out.println("获取内容:"+str);
		client.close();
		br.close();
	}
}
服务器端运行后的结果是:
服务器运行,等待客户端连接
客户端运行之后,客户端结果为:
获取内容:hello world
客户端成功的收到了服务器端发来的字符串。因为程序最后都写了关闭资源,所以客户端从服务器端读取信息后就关闭了,因为服务器此时只能处理一次连接请求,所以服务器端也将关闭。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值