Java网络编程->常用模块

一、Java客服端和服务端实例:

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

/*
	该服务端功能是将客户端输入的字母转成大写,并返回

		1、创建ServerSocket,服务器套接字
		2、accept() 侦听并接受到此套接字的连接。
		3、通过Socket的getInputStream() 方法返回此套接字的输入流。
			在服务,处理
			通过Socket的getOutputStream() 方法返回此套接字的输出流。
			在发给客户端
		4、关闭socket
*/

//服务端
class MyServer 
{
	public static void main(String[] args) throws Exception
	{
		ServerSocket srv = new ServerSocket(8189);

		Socket so = srv.accept();
		InetAddress inet = so.getLocalAddress();

		String ip = inet.getHostAddress();

		System.out.println(ip + "..connected");
		//输入流
		InputStream inStream = so.getInputStream();
		//输出流
		OutputStream outStream = so.getOutputStream();

		Scanner in = new Scanner(inStream);
		PrintWriter out = new PrintWriter(outStream, true); //自动刷

		//接受客户端传来的数据并转成大写,返回给客户端,输入BYE退出
		boolean done = false;

		while (!done && in.hasNext())
		{
			String str = in.nextLine();
			out.println(str.toUpperCase());
			if (str.equals("BYE"))
			{
				done = true;
			}
		}

		so.close();
	}
}


//客户端

/*
	1、创建套接字
	2、分别获取输入流和输出流
	3、关闭套接字
*/
class MyClient
{
	public static void main(String[] args) throws Exception
	{
		Socket so = new Socket("localhost",8190);
		
		//输入流
		InputStream inStream = so.getInputStream();
		//输出流
		OutputStream outStream = so.getOutputStream();

		Scanner in = new Scanner(inStream);
		PrintWriter out = new PrintWriter(outStream, true); //自动刷

		//键盘输入流
		Scanner keyIn = new Scanner(System.in);

		while (keyIn.hasNext())
		{
			String str = keyIn.nextLine();
			out.println(str);
			System.out.println(in.nextLine());
		}
		so.close();
	}
}

二、常用API

1、Socket类,套接字
构造方法:全是protected 
Socket(String host, int port) 
          创建一个流套接字并将其连接到指定主机上的指定端口号。
    Socket(InetAddress address, int port) 
          创建一个流套接字并将其连接到指定 IP 地址的指定端口号。
          
    方法:
    void connect(SocketAddress endpoint) 
          将此套接字连接到服务器。 
     InetAddress getInetAddress() 
          返回套接字连接的地址。 
    InputStream getInputStream() 
          返回此套接字的输入流。
     InetAddress getLocalAddress() 
          获取套接字绑定的本地地址 
     int getPort() 
          返回此套接字连接到的远程端口。
     OutputStream getOutputStream() 
          返回此套接字的输出流。 
     void setSoTimeout(int timeout) 
          启用/禁用带有指定超时值的 SO_TIMEOUT,以毫秒为单位。 
     void shutdownInput() 
          此套接字的输入流置于“流的末尾”。 
  void shutdownOutput() 
          禁用此套接字的输出流。 
          
2、InetAddress类,此类表示互联网协议 (IP) 地址。 
static InetAddress getByName(String host) 
          在给定主机名的情况下确定主机的 IP 地址。 
     static InetAddress[] getAllByName(String host) 
          在给定主机名的情况下,根据系统上配置的名称服务返回其 IP 地址所组成的数组。 
     String getHostAddress() 
          返回 IP 地址字符串(以文本表现形式)。 
    String getHostName() 
          获取此 IP 地址的主机名。
3、InetSocketAddress 类,此类实现 IP 套接字地址(IP 地址 + 端口号)。
  构造方法:
     InetSocketAddress(String hostname, int port) 
          根据主机名和端口号创建套接字地址。
     InetSocketAddress(InetAddress addr, int port) 
          根据 IP 地址和端口号创建套接字地址。
    方法:
     InetAddress getAddress() 
          获取 InetAddress。 
    String getHostName() 
          获取 hostname。 
  int getPort() 
          获取端口号。 

二、超级服务器:多个客户端
import java.io.*;
import java.net.*;
import java.util.Scanner;

/*
	超级服务器,可以有多个客户端连接
	
	思路:为每个套接字连接新建一个线程,这样就可以并发处理了
*/

//功能线程
class ServerThread implements Runnable
{
	private Socket so;
	ServerThread(Socket s) {
		this.so = s;
	}

	public void run() {
		try
		{
			InetAddress inet = so.getLocalAddress();
			String ip = inet.getHostAddress();

			System.out.println(ip + "..connected");
			//输入流
			InputStream inStream = so.getInputStream();
			//输出流
			OutputStream outStream = so.getOutputStream();

			Scanner in = new Scanner(inStream);
			PrintWriter out = new PrintWriter(outStream, true); //自动刷

			//接受客户端传来的数据并转成大写,返回给客户端,输入BYE退出
			boolean done = false;

			while (!done && in.hasNext())
			{
				String str = in.nextLine();
				out.println(str.toUpperCase());
				if (str.equals("BYE"))
				{
					done = true;
				}
			}
		}
		catch (Exception e)
		{
			e.printStackTrace();
		}
		finally
		{
			try
			{
				so.close();
			}
			catch (IOException ie)
			{
				ie.printStackTrace();
			}
		}
		
	}
}

class MySuperServer
{
	public static void main(String[] args) throws Exception
	{	
		ServerSocket s = new ServerSocket(8190);
		while(true)
		{
			Socket so = s.accept();

			Runnable r = new ServerThread(so);
			new Thread(r).start();
		}
	}
}

三、多线程上次图片

import java.io.*;
import java.net.*;
import static java.lang.Math.*;

/*
	上传图片服务器,多线程

	1、新建ServerSocket对象
*/

//上传图片多线程
class PicThread implements Runnable
{	
	private Socket so;
	PicThread(Socket s) {
		this.so = s;
	}

	public void run() {
		try
		{
			//获取连接该服务器的IP地址
			InetAddress inet = so.getInetAddress();
			String ip = inet.getHostAddress();
			System.out.println(ip + "..connected...");
			
			//获取流对象
			InputStream in = so.getInputStream();

			OutputStream out = so.getOutputStream();

		
			File picFile = new File(ip + "(" + (int)(random()*100) + ").jpg");
			
			FileOutputStream fos = new FileOutputStream(picFile);

			//读取数据
			byte[] buf = new byte[1024];
			int len = 0;
			while ((len = in.read(buf)) != -1)
			{
				fos.write(buf, 0, len);
			}
			
			//给客户端返回上传成功消息
			out.write("上传成功".getBytes());
			so.close();
			fos.close();

		}
		catch (Exception e)
		{
			new RuntimeException("图片上传失败!");
		}
		
		
	}
}

//服务端
class UploadPicServer
{
	public static void main(String[] args) throws Exception
	{
		ServerSocket s = new ServerSocket(8999);

		while (true)
		{
			Socket so = s.accept();
			Runnable r = new PicThread(so);
			new Thread(r).start();
		}
	}
}

/*
	上传图片客户端
*/
class UploadPicClient
{
	public static void main(String[] args) throws Exception
	{
		Socket so = new Socket("127.0.0.1",8999);

		//输入流
		InputStream inStream = so.getInputStream();
		//输出流
		OutputStream outStream = so.getOutputStream();

		//文件输入流
		File picFile = new File(args[0]);

		FileInputStream fileIn = new FileInputStream(picFile);

		byte[] bufout = new byte[1024];
		int len = 0;
		while ((len = fileIn.read(bufout)) != -1)
		{
			outStream.write(bufout, 0, len);
		}
		so.shutdownOutput();

		//获取服务器返回的信息
		byte[] bufIn = new byte[1024];
		int num = inStream.read(bufIn);
		System.out.println(new String(bufIn,0,num));

		so.close();
		inStream.close();
		outStream.close();
		fileIn.close();
	}
}

四、URL类:URL 代表一个统一资源定位符

1、构造方法:
URL(String spec) 
          根据 String 表示形式创建 URL 对象。
    URL(String protocol, String host, String file) 
          根据指定的 protocol 名称、host 名称和 file 名称创建 URL。
  2、常用方法:
  int getDefaultPort() 
          获取与此 URL 关联协议的默认端口号。 
String getFile() 
          获取此 URL 的文件名。 
String getHost() 
          获取此 URL 的主机名(如果适用)。 
String getPath() 
         获取此 URL 的路径部分。 
int getPort() 
         获取此 URL 的端口号。 
String getProtocol() 
         获取此 URL 的协议名称。 
String getQuery()  
获取此 URL 的查询部分。
URLConnection openConnection() 
          返回一个 URLConnection 对象,它表示到 URL 所引用的远程对象的连接。 
     InputStream openStream() 
          打开到此 URL 的连接并返回一个用于从该连接读入的 InputStream。
六、URLConnection类,它代表应用程序和 URL 之间的通信链接。
1、方法:
String getHeaderField(String name) 
          返回指定的头字段的值。 
          
     String getHeaderFieldKey(int n) 
          返回第 n 个头字段的键。 
     Map<String,List<String>> getHeaderFields() 
          返回头字段的不可修改的 Map。
     InputStream getInputStream() 
          返回从此打开的连接读取的输入流。 
    OutputStream getOutputStream() 
          返回写入到此连接的输出流。 
     void setDoInput(boolean doinput) 
          将此 URLConnection 的 doInput 字段的值设置为指定的值。 
  void setDoOutput(boolean dooutput) 
          将此 URLConnection 的 doOutput 字段的值设置为指定的值。 

实例:
import java.net.*;
import java.io.*;

/*
	URL 和URLConnection
*/
class HttpTest 
{
	public static void main(String[] args) throws Exception
	{
		URL url = new URL("http://127.0.0.1/index.html");

		URLConnection u = url.openConnection();

		InputStream webFile = u.getInputStream();

		byte[] buf = new byte[1024];
		int len = 0;
		while ((len = webFile.read(buf)) != -1)
		{
			System.out.println(new String(buf, 0, len));
		}
		System.out.println(len);
		webFile.close();
	}
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值