`

TCP Socket编程总结

    博客分类:
  • Java
阅读更多

TCP:是专门设计用于在不可靠的英特网上提供可靠的、端到端的字节流通信的协议,它是一个面向连接的协议,TCP连接是字节流而非报文流。

这里再简单说说UDPTCP的区别:

        TCP:可靠的连接传输,使用三方握手的方式完成通讯;

        UDP:不可靠的连接传输,传输的时候接受方不一定可以接受的到;

java中的所有网络程序的开发类都在java.net包中存在

    Socket:两个Java应用程序可通过一个双向的网络通信连接实现数据交换,这个双向链路的一端称为一个SocketSocket通常用来实现clientserver连接、java.net包中定义的两个SocketServerSocket,分别用来实现双向连接的clientserver端、建立连接时所需的寻址信息为远程计算机的IP地址和端口号(Port number)

    网络应用分为客户端和服务器端两部分,而Socket类是负责处理客户端通信的java类。通过这个类可以连接到指定IP或域名的服务器上,并且可以和服务器互相发送和接受数据。

    java中使用Scoket(即套接字)完成TCP程序的开发,即使用此类可以方便的建立可靠的,双向的,持续的,点对点的通讯连接。

    Scoket的程序开发中,服务器端使用ServerSocket等待客户端的连接,对于java的网络编程来说,每一个客户端都使用一个Scoket对象表示。

 

java的网络程序中,客户端只要符合来连接的通讯协议,那么服务器端都可以进行接受。

    首先我们需要了解一下TCP Socket编程的思路:首先是编写服务器端和客户端:

1、开发服务器端,通过ServerSocket server=new ServerSocket(8889); 构造ServerSocket使得服务器在8889端口上监听。

2、通过ServerSocketaccept方法得到连接,此时程序进入到阻塞状态

3、通过打印流向客户端输出系信息。

4、然后依次关闭服务器端的SocketServerSocket

5、开发客户端,通过Socket client=new Socket("localhost",8888) ;构造Socket实例。

6、最后通过一次性接受并关闭对应流和Socket

 

通过Demo发现TCP Socket编程只要考察的是Socket编程IO流和线程。

IO流:这里我们使用打印流和缓冲流;

线程:这里我们使用并且如果要想实现可以开启多个客户端的,则需要使用线程,让每开启一个客户端我们就启动一个线程。达到实现多个客户端通讯。

 

在利用TCP Socket实现通讯中只要记住“服务器端的输出就是客户端的输入,客户端的输出就是服务器端的输入”即可。

 

线程类:

package com.iflytek.socket;

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.PrintStream;
import java.net.Socket;

/**
 * @author xudongwang 2012-1-9
 * 
 *         Email:xdwangiflytek@gmail.com
 */
public class EchoThread implements Runnable {
	private Socket client = null;

	public EchoThread(Socket client) {
		this.client = client;
	}

	@Override
	public void run() {
		BufferedReader buf = null; // 接收输入流
		PrintStream out = null; // 打印流输出最方便
		try {
			out = new PrintStream(client.getOutputStream());
			// 准备接收客户端的输入信息
			buf = new BufferedReader(new InputStreamReader(
					client.getInputStream()));
			// 标志位,表示可以一直接收并回应信息
			boolean flag = true;
			while (flag) {
				// 接收客户端发送的内容
				String str = buf.readLine();
				if (str == null || "".equals(str)) { // 表示没有内容
					flag = false; // 退出循环
				} else {
					// 如果输入的内容为bye表示结束
					if ("bye".equals(str)) {
						flag = false;
					} else {
						out.println("ECHO : " + str); // 回应信息
					}
				}
			}
			client.close();
		} catch (Exception e) {
		}

	}

}

 

 服务器端:

package com.iflytek.socket;

import java.net.ServerSocket;
import java.net.Socket;

/**
 * @author xudongwang 2012-1-9
 * 
 *         Email:xdwangiflytek@gmail.com
 */
public class EchoThreadServer {
	public static void main(String args[]) throws Exception {
		ServerSocket server = null; // 定义ServerSocket类
		Socket client = null; // 表示客 户端
		server = new ServerSocket(8889); // 服务器在8888端口上监听
		boolean f = true; // 定义个标记位
		while (f) {
			System.out.println("服务器运行,等待客户端连接。");
			// 得到连接,程序进入到阻塞状态
			client = server.accept();
			// 每一个客户端表示一个线程
			new Thread(new EchoThread(client)).start();
		}
		server.close();
	}

}

 

 客户端:

package com.iflytek.socket;

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.PrintStream;
import java.net.Socket;

/**
 * @author xudongwang 2012-1-9
 * 
 *         Email:xdwangiflytek@gmail.com
 */
public class EchoClient {
	public static void main(String args[]) throws Exception {
		Socket client = null; // 表示客 户端
		client = new Socket("localhost", 8889);
		BufferedReader buf = null; // 一次性接收完成
		PrintStream out = null; // 发送数据
		BufferedReader input = null; // 接收键盘数据
		input = new BufferedReader(new InputStreamReader(System.in));
		buf = new BufferedReader(new InputStreamReader(client.getInputStream()));
		out = new PrintStream(client.getOutputStream());
		boolean flag = true; // 定义标志位
		while (flag) {
			System.out.print("输入信息:");
			String str = input.readLine(); // 接收键盘的输入信息
			out.println(str);
			if ("bye".equals(str)) {
				flag = false;
			} else {
				String echo = buf.readLine(); // 接收返回结果
				System.out.println(echo); // 输出回应信息
			}
		}
		buf.close();
		client.close();
	}

}
  • 大小: 12.8 KB
0
0
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics