Chapter02 网络(一)

建立的简单套接字:

	@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();
	}
	}

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

Socket 部分方法:

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

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

//该方法测试如果线程发生中断,将会以抛出异常的方式结束
@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);
}




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值