网络基础

本文详细介绍了Java中的TCP和UDP协议在网络编程中的应用,包括Socket类的使用方法、服务器端和客户端的实现步骤,以及如何处理套接字超时等问题。

下面介绍的内容仅适用于TCP(传输控制协议)网络协议。Java平台另外还支持所谓的UDP(用户数据报协议)协议,该协议可以用于发送数据包(也称为数据报),它所需付出的开销要比TCP少得多。UDP有一个重要的缺点:数据包无需按照顺序进行传递,它们甚至可能在传输过程中全部丢失。UDP要求数据包的接受者对它们进行排序,并请求发送者重新发送那些丢失的数据包。UDP比较适合于那些可以忍受数据包丢失的应用,例如用于音频流和视频流的传输,或者用于连续测量的应用领域。

Socket
Socket(String host, int port)构建一个套接字,用来连接给定的主机和端口。
InputStream getInputStream()
OutputStream getOutputStream()
获取可以从套接字中读取数据的流,以及可以向套接字写出数据的流。
套接字超时

从套接字读取信息时,在可以访问数据之前,读操作将会被阻塞。如果此时主机不可达,那么应用将要等待很长的时间,并且因为受底层操作系统的限制而最终会导致超时。对于不同的应用,应该确定合理的超时值。然后调用setSoTimeout方法设置这个超时值(单位:毫秒)。如果已经为套接字设置了超时值,并且之后的读操作和写操作在没有完成之前就超过了时间限制,那么这些操作就会抛出SocketTimeoutException异常。
Socket(String host,int port)会一直无限期地阻塞下去,直到建立了到达主机的初始连接为止。

Socket a  = new Socket();
a.connect(new InetSocketAddress("",80), 10);这样就解决了前面一直阻塞的问题
Socket()创建一个还未被连接的套接字。
void connect(SocketAddress address) 将该套接字连接到给定的地址。
void connect(SocketAddress address, int timeoutInMilliseconds) 将套接字连接到给定的地址。如果在给定的时间内没有响应,则返回。
void setSoTimeout(int timeoutInMilliseconds) 设置该套接字上读请求的阻塞时间。如果超出给定时间,则抛出一个InterruptedIOException异常。
boolean isConnected() 如果该套接字已被连接,则返回true。
boolean isClosed() 如果套接字已经被关闭,则返回true。

因特网地址

因特网地址是指用一串数字表示的主机地址,它由4个字节组成, IPv6规定为16个字节,比如132.163.4.102。通常,不用过多考虑因特网地址的问题。但是,如果需要在主机名和因特网地址之间进行转换时,可以使用InetAddress类。
静态的getByName方法可以返回代表某个主机的InetAddress对象。

InetAddress ia = InetAddress.getByName("localhost");
然后,可以使用getAddress方法来访问这些字节。
System.out.println(ia.getHostName());
byte[]  b = ia.getAddress();
可以通过调用getAllByName方法来获得所有主机
InetAddress[] ia = InetAddress.getAllByName("localhost");
以使用静态的getLocalHost方法来得到本地主机的地址
InetAddress a =InetAddress.getLocalHost();

static InetAddress getByName(String host)
static InetAddress[] getAllByName(String host)
为给定的主机名,创建一个InetAddress对象,或者一个包含了该主机名所对应的所有因特网地址的数组。
static InetAddress getLocalHost()为本地主机创建一个InetAddress对象。
byte[] getAddress()返回一个包含数字型地址的字节数组。
String getHostAddress()返回一个由十进制数组成的字符串,各数字间用圆点符号隔开,例如, “132.163.4.102”。
String getHostName()返回主机名

实现服务器

使用ServerSocket类用于建立一个套接字。

ServerSocket ss = new ServerSocket(int port);
Socket s = ss.accept();
然后创建输入输出流读取内容。

ServerSocket(int port)创建一个监控端口的服务器套接字。
Socket accept()
等待连接。该方法阻塞(即,使之空闲)当前线程直到建立连接为止。该方法返回一个套接字对象,程序可以通过这个对象与连接中的客户端进行通信。
void close()关闭服务器套接字。
客户端
public static void main(String[] args) throws UnknownHostException, IOException {
		Socket a  = new Socket("127.0.0.1",8189);
		InputStream is = a.getInputStream();
		OutputStream os = a.getOutputStream();
		PrintWriter pw = new PrintWriter(os);
		BufferedReader bf = new BufferedReader(new InputStreamReader(is));
		Scanner scanner = new Scanner(System.in);
		String s;
		while((s=bf.readLine())!=null){
			System.out.println(s);
			pw.println(scanner.nextLine());
			pw.flush();
		}
服务器
ServerSocket ss = new ServerSocket(8189);
		Socket s = ss.accept();
		InputStream is = s.getInputStream();
		OutputStream os = s.getOutputStream();
		PrintWriter pw = new PrintWriter(os);
		BufferedReader bf = new BufferedReader(new InputStreamReader(is));
		pw.println("hello,enter bye to close");
		pw.flush();
		boolean flag=true;
		String input;
		while((input=bf.readLine())!=null&& flag){
			pw.println(input);
			if(input.equals("bye")){
				flag=false;
			}
			pw.flush();
		}
		s.close();


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值