欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Chapter02 网络(一)

程序员文章站 2022-03-22 23:15:09
...

建立的简单套接字:

	@Test
	public void testSocket() throws UnknownHostException, IOException
	{
		Socket socket=new Socket("www.sohu.com",80);
		//设置超时的时间
		socket.setSoTimeout(1000);
		InputStream in=socket.getInputStream();
		Scanner s=new Scanner(in);
		while(s.hasNext())
		{
			String line=s.nextLine();
			System.out.println(line);
		}
		
	}
设置套接字的超时时间,如果在时间范围外,进行数据的写入写出的操作,会抛出SocketTimeOutException异常。

实现IP与域名的转化:

	@Test
	public void testIP() throws UnknownHostException
	{
		//实现IP与域名的转化
		InetAddress address=InetAddress.getByName("java.sun.com");
		System.out.println(address);
		
		//由于可能存在多个IP返回所有
		InetAddress[] addresses=InetAddress.getAllByName("java.sun.com");
		for (InetAddress inetAddress : addresses) {
			System.out.println();
		}
		
		//本地IP地址
		System.out.println(InetAddress.getLocalHost());
	}
实现简单的服务器:

	@Test
	public void testServer() throws IOException
	{
		//建立套接字
		ServerSocket serverSocket=new ServerSocket(8080);
		//不断地监听8080端口
		Socket socket=serverSocket.accept();
		//获取输入流
		InputStream inputStream=socket.getInputStream();
		//打印出客户端信息
		Scanner scanner=new  Scanner(inputStream);
		while (scanner.hasNext()) {
			String line=scanner.nextLine();
			System.out.println(line);
		}
		//获取输出流
	    OutputStream outputStream=socket.getOutputStream();
	    //向客户端发送信息
	    outputStream.write("这是一条来自服务器的信息".getBytes());
	    //关闭输出流
	    outputStream.close();
	    //关闭套接字
	    socket.close();
	}
在命令输入行输入:telnet localhost 8080即可进行操作。

上述程序只允许一个客户端连接,下面的程序允许多个客户端连接:

//多客户端连接
	@Test
	public void testMultiSocket() throws IOException
	{
		//建立套接字
		ServerSocket serverSocket=new ServerSocket(8080);
		int i=0;
		while(true)
		{
			//不断地监听8080端口
			Socket socket=serverSocket.accept();
			//实现多线程,允许多个客户端连接
			Runnable r=new ThreadEchoHandler(socket);
			Thread thread=new Thread(r);
			thread.start();
			i++;
		}
	}
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.io.PrintWriter;
import java.net.Socket;
import java.util.Scanner;


public class ThreadEchoHandler implements Runnable {

	private Socket incoming;
	public ThreadEchoHandler(Socket socket) {
		incoming=socket;
	}

	@Override
	public void run() {
	try
	{
		try
		{
			InputStream inputStream=incoming.getInputStream();
			OutputStream outputStream=incoming.getOutputStream();

			Scanner s=new Scanner(inputStream);
			PrintWriter writer=new PrintWriter(outputStream);

			writer.println("Hello! Enter BYE ro exit");
			boolean b=false;
			while(!b&&s.hasNext())
			{
				String line=s.nextLine();
				writer.println("echo:"+line);
				if(line.trim().equalsIgnoreCase("BYE"))
				{
					b=true;
				}
			}
		}
		catch(IOException e)
		{
			e.printStackTrace();
		}
		finally
		{
			incoming.close();
		}
	}
	catch(IOException e)
	{
		e.printStackTrace();
	}
	}

}
套接字的一个功能是:套接字连接的一端可以终止其输出,同时仍旧可以接受来自另一端的数据。

Chapter02 网络(一)

Socket 部分方法:

Chapter02 网络(一)

当连接一个套接字时,当前线程将会被阻塞直到建立连接或者超时为止。

为了中断套接字操作,使用java.nio提供的SocketChannel类,

Chapter02 网络(一)

//该方法测试如果线程发生中断,将会以抛出异常的方式结束
@Test
public void testChannel() throws IOException
{
//获取通道,SocketChannel实现了ReadableByteChannel和WriteableByteChannel接口
SocketChannel channel=SocketChannel.open(new InetSocketAddress("baidu.com", 80));
//使用Scanner类来家获取信息
Scanner scanner=new Scanner(channel);
//将通道转化为输出流
OutputStream outputStream=Channels.newOutputStream(channel);
}