1. 使用URL?

答:java.net.URL类是对网络资源地址的表示,URL即Uniform Resource Location,基本格式:

     协议名: 主机名/目录及文件名  如:

java.net.URL类对网络资源的访问进行了封装,通过URL直接获取网上的文件内容,步骤如下:

1)创建一个URL类型的对象

2)利用URL类的openStream()获得对应的InputStream类的对象

3)通过InputStream来读取内容

例如,

import java.io.*;
import java.net.*;
import java.awt.*;
import java.applet.*;

public class URLGetFile extends Applet{
	
	public void init() {
		try {
			url=new URL("");
		}catch(MalformedURLException e) {
			System.out.println("URL格式错误");
		}
		add(area);
	}
	
	private URL url;
	TextArea area=new TextArea("下载的数据:\n");
	
	public void start() {
		String line;
		try {
			InputStream iStream=url.openStream();//获得openStream
			BufferedReader bReader=new
					BufferedReader(new InputStreamReader(iStream));
			
			while((line=bReader.readLine())!=null) {
				area.append(line+"\n");
			}
		}catch(IOException e) {
			System.out.println(e.getMessage());
		}
	}
	
	public static void main(String[] args) {
		Frame f=new Frame("URL Test");
		Applet ap=new URLGetFile();
		ap.init();
		f.add(ap);
		f.setSize(500, 400);
		f.show();
		ap.start();
	}
}

java url zhengze校验 java中url编写规则_服务器


2. 用Java实现底层网络通信?

答:用Java实现底层网络通信,就是用Java程序实现网络通信协议所规定的功能的操作,网络通信的协议很多,这里只讨论基于套接字(Socket)的Java编程。套接字是基于 TCP/IP 协议的编程接口,通信双方通过Socket来进行通信。

1)InetAddress类

    主要用来区分计算机网络中不同节点,即不同的计算机并对其寻址。每个InetAddress对象中包括了IP地址、主机名等信息。使用InetAddress类可以在程序中用主机名代替IP地址,从而使程序更加灵活,可读性更好。

2)流式 Socket 的通信机制

    其是基于连接的通信,即在通信开始之前,先由通信双方确认身份并建立一条专用的虚拟连接通道,然后它们通过这条通道传送数据信息进行通信,当通信结束时再将原先所建立的连接拆除。

    Server端首先建立一个ServerSocket对象,调用 listen() 方法在某端口提供一个监听Client请求的监听服务,当Client端向Server发出连接请求时,ServerSocket调用 accept() 方法接受这个请求,并建立一个Socket与客户端的Socket进行通信。通信的基本方式是通过Socket得到流对象,在流对象上进行输入与输出。

3)Socket类

    客户端要与服务端相连,则客户端需要建立Socket对象,格式为

        Socket name = new Socket("机器名或IP地址",端口号);

其中,端口号要与服务器上提供的端口号一致。Socket有两种重要方法:getInputStream() 和 getOutputStream(),利用它们可以得到相关的输入输出流。Socket通信完毕要使用close()方法关闭。

4)ServerSocket类

    服务器程序不用于客户机,他需要初始化一个端口进行监听,遇到连接呼叫,才与相应的客户机建立连接。部分方法:

☛    public ServerSocket(int port)    构造方法

☛    public Socket accept() throws IOException    接受客户请求

☛    public InetAddress getInetAddress()    得到地址

☛    public int getLocalPort()    得到本地的端口

☛    public void close() throws IOException    关闭服务

☛    public synchronized void setSoTimeout(int timeout) throws  SocketException    设置超时的时间

☛    public synchronized int getSoTimeout() throws IOException    得到超时的时间

    ServerSocket 构造器是服务器程序运行的基础,它将参数port指定的端口初始化作为该服务器的端口,监听客户机连接请求。Port的范围是 0~65536,但0~1023是标准Internet协议保留端口,一般自定义的端口号在8000~16000之间。

    仅初始化了ServerSocket还是远远不够的,他没有同客户机交互的套接字,因此需要调用该类的accept()方法直到接受客户机呼叫。accept()方法直到有连接请求才返回通信套接字的实例。通过这个实例的输入输出流,服务器可接受用户指令,并将相应结果回应客户机。

例如,

import java.net.*;
import java.io.*;

public class TestServer {

	public static void main(String[] args) {
		ServerSocket s=null;
		
		try {
			s=new ServerSocket(8888);
		}catch(IOException e) {}
		while(true) {
			try {
				Socket s1=s.accept();
				
				OutputStream os=s1.getOutputStream();
				DataOutputStream dos=new DataOutputStream(os);
				
				dos.writeUTF("Hello,man.");
				dos.close();
				s1.close();
				s.close();
			}catch(IOException e) {};
		}
	}
}

本服务器程序在8888号端口进行监听,一旦有服务相连,则接受请求,并向客户发送信息“Hello,man.”。


import java.io.*;
import java.net.*;

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

本客户机程序与本机机器(127.0.0.1)的8888号端口相连,从服务器上读取信息“Hello,man.”并显示。


3. 实现多线程服务器程序?

答:上面例子中,针对一个客户机进行服务后,才能进行对其它客户进行服务,为了同时对多个客户进行服务,需要利用多线程,每个线程针对一个客户进行服务。

多线程服务器程序的实现请看另文    /article/details/79437878    。