Java 网络编程

一、TCP/IP协议

为了进行网络通信,通信双方必须遵守通信协议.目前最广泛使用的是TCP/IP协议。

TCP/IP协议是一个协议组,包含Telnet、FTP、SMTP、NFS、HTTP等协议。

网络接口层:负责接收和发送物理帧;
网络层:负责相邻节点之间的通信;
传输层:负责起点到终点的通信;
应用层:提供诸如文件传输、电子邮件等应用程序。

二、InetAddress类

Java中inelAddress类是针对Java封装的互联网协议(IP)地址,它是Java对IP地址的一种高级标志。

public static void main(String argsp[]) throws UnknownHostException {
		InetAddress addr = InetAddress.getByName("it.warmtel.com");
		String hostAddress = addr.getHostAddress();//获取主机地址
		String hostName = addr.getHostName();//获取主机名
		System.out.println("主机名:" + hostName + ",\t主机地址:" + hostAddress);
	}

三、统一资源定位符URL 

1、定义:

URL是一种最为直观的网络定位方式,它表示Internet上的某一资源地址。

2、格式:

<Method>   ://<hostName:PORT>/<PATH>/<FILE>

                  <传输协议>://      <主机名:端口>     /<路径名>/ <文件名>

                  例如:http     端口号默认为80可省略

3、Java中URL类

一个URL对象可以表示一个网络资源。程序利用URL对象能实现Internet寻址、网络资源的定位连接、在客户机与服务器之间直接访问等。

	public static void main(String[] args) throws IOException {
		URL url = new URL("http://www.baidu.com");
		URLConnection connection = url.openConnection();// 建立链接
		// 建立缓冲输入流
		BufferedReader br = new BufferedReader(new InputStreamReader(connection.getInputStream()));
		String str;
		while (br.readLine() != null) {
			str = br.readLine();
			System.out.println(str);
		}
	}

四、Socket类

1、UDP协议和TCP协议

(1)UDP无连接,TCP面向链接

(2)UDP每个数据包大小限制为64k,TCP可以传输较大的数据

(3)UDP将传输的数据分成小包,直接上网发送。无需建立连接和拆除连接,速度快,但无可靠保证

          TCP每次通信前建立连接,通信结束后断开连接。特点是可以保证传输的正确性、可靠性。

2、Socket是TCP/IP协议的一种编程方式

一个Socket由一个IP地址和一个端口号唯一确定

(1)客户端Socket

/**
	 * 启动客户端
	 */
	public void startClient() {
		try {
			Socket socket = new Socket(IP, PORT);
			sendMsg(socket);
			getMsg(socket);
		} catch (IOException e) {
			e.printStackTrace();
		}
	}

	/**
	 * 客户端发送消息
	 * 
	 * @param socket
	 */
	public void sendMsg(Socket socket) {
		new Thread(new Runnable() {

			@Override
			public void run() {
				try {
					BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
					PrintWriter pw = new PrintWriter(socket.getOutputStream());
					System.out.println("请输入要发送的消息:");
					String msg = br.readLine();
					while (msg != null) {
						pw.println(msg);
						pw.flush();
						System.out.println("发送成功!");
						System.out.println("请输入要发送的消息:");
						msg = br.readLine();
					}
					socket.close();
				} catch (IOException e) {
					e.printStackTrace();
				}

			}
		}).start();

	}

	/**
	 * 客户端接收消息
	 */
	public void getMsg(Socket socket) {
		new Thread(new Runnable() {

			@Override
			public void run() {
				try {
					BufferedReader br = new BufferedReader(new InputStreamReader(socket.getInputStream()));
					String msg = br.readLine();
					System.out.println("服务器:" + msg);
					while (true) {
						msg = br.readLine();
						System.out.println("服务器:" + msg);
					}
				} catch (IOException e) {

				}
			}
		}).start();

	}
(2)服务端Soceket

/**
	 * 服务端启动
	 * 
	 * @throws IOException
	 */
	public void startServer() throws IOException {
		ServerSocket sSocket = new ServerSocket(PORT);
		System.out.println("欢迎进入");
		sendMsg();
		while (true) {
			Socket socket = sSocket.accept();
			System.out.println("新用户加入聊天");
			socketList.add(socket);
			getMsg(socket);
			size = socketList.size();
			System.out.println("当前用户人数:[" + size + "]人");
		}

	}

	/**
	 * 服务端群发消息
	 */
	public void sendMsg() {
		new Thread(new Runnable() {
			@Override
			public void run() {
				try {
					BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
					while (true) {
						System.out.println("请输入要发送的信息:");
						String msg = br.readLine();
						for (Socket s : socketList) {
							PrintWriter pw = new PrintWriter(s.getOutputStream());
							pw.println(msg);
							pw.flush();
						}
					}
				} catch (IOException e) {
					e.printStackTrace();
				}
			}
		}).start();
	}

	/**
	 * 服务器接收消息并且转发给除发送信息外其他客户端
	 */
	public void getMsg(Socket socket) {
		new Thread(new Runnable() {
			@Override
			public void run() {
				BufferedReader br;
				try {
					br = new BufferedReader(new InputStreamReader(socket.getInputStream()));
					while (true) {
						String msg = br.readLine();
						if (msg != null) {
							System.out.println("客户端:" + msg);
						}
						for (Socket s : socketList) {
							if (s == socket)
								continue;
							PrintWriter pw = new PrintWriter(s.getOutputStream());
							pw.println(msg);
							pw.flush();
						}
					}
				} catch (IOException e) {
					e.printStackTrace();
				}
			}
		}).start();

	}



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值