Java14-网络编程

  TCP(Transmission Control Protocol) 面向连接的通信协议ü,提供两台计算机间的可靠的、端到端的字节流通信的协议。
  **UDP(User Datagram Protocal)**无连接的通信协议 UDP不保证可靠数据的传输。

14.1Socket原理

  Socke——套接字,是网络应用程序编程的接口和一种机制,用套接字中的相关函数来建立连接和完成通信,Socket可以看成在两个程序进行通讯连接中的一个端点。
  基于TCP的Socket编程:
  利用TCP协议进行通信两个应用程序,有主从之分一个称为服务器程(Server),另外一机程(Client)。
在这里插入图片描述
  交互过程:
  (1) 服务器程序创建一个ServerSocket,然后调用accept方法等待客户来连接。
  (2) 客户端程序创建一个socket,并请求与服务器建立连接。
  (3) 刚才建立了连接的两个socket在一个单独的线程上对话。
  (4) 服务器开始等待新的连接请求。

14.2Socket编程

----java.net.ServerSocket
  构造函数:

ServerSocket(int port)
ServerSocket(int port, int maxqu)

  accept( ) 方法用于等待客户端触发通信,返回值类型为Socket。

----java.net.Socket
  构造函数:

Socket(String hostName, int port)
 Socket(InetAddress a, int port)

  可用方法:

InetAddress getInetAddress( )
int getPort( )
int getLocalPort( )
InputStream getInputStream()
OutputStream getOutputStream()
void close()

14.3实例

  在使用Socket方法时首先要启动服务器。
public class Server {

	public void start(){
		int port = 8888;
		ServerSocket serverSocket = null;
		Socket socket = null;
		try{
			serverSocket = new ServerSocket(port);
			while(true){
				socket = serverSocket.accept();
				System.out.println("客户端连接成功"+socket.getInetAddress().getHostAddress()
						+":"+socket.getPort());
				new Thread(new Chat(socket)).start();
			}
		}catch(IOException  e){
			e.printStackTrace();
		}finally{
			关闭连接操作
		}
	public static void main(String[] args) {
		Server server2 = new Server();
		server2.start();
	}
}

  Socket服务端方法实例:
  步骤:定义属性port连接服务器:ServerSocket(port)等待客户连接.accept()InputStream,OutputStream读写数据close关闭连接。
  例1:编写一服务器端程序,实现读取客户端发送过来的一组整数, 表现为一组数与数之间用空格隔开的字符串。对这组整数进行排序处理后,返回相应的字符串给客户端,如果数据格式不正确,则返回错误信息, 以本机作为服务器。
public class SortServer {

	private int port = 8888;
	source有参和无参构造方法
	public void work() {
		ServerSocket serverSocket = null;
		Socket socket = null;
		InputStream inputStream = null;
		OutputStream outputStream = null;
		try {
			// 1.启动服务器监听
			serverSocket = new ServerSocket(port);
			// 2.等待客户端连接
			socket = serverSocket.accept();
			// 3.打开输入输出流
			inputStream = socket.getInputStream();
			outputStream = socket.getOutputStream();
			// 4.读取客户端发生的数据
			byte[] buffer = new byte[512];
			while (true) {
				int len = inputStream.read(buffer);
				// 5.数据处理
				String string = new String(buffer, 0, len);
				String[] data = string.trim().split(" ");
				try {
					int[] intData = transferAndSort(data);
					string = intArrayToString(intData, " ");
					System.out.print("Presorted data:");
					for (String a : data) {
						System.out.print(a + " ");
					}
					System.out.println("Sorted data:" + string);
				} catch (Exception e) {
					string = e.getMessage();
					string = "data format error!";
					System.out.println(string);
				}
				// 6.把数据发送回客户端
				outputStream.write(string.getBytes());
			}
			// 7.关闭流和网络
		} catch (IOException e) {
			e.printStackTrace();
		} finally {
			closeAll(outputStream, inputStream, serverSocket, socket);
		}
	}
	//把字符串转换为整型
	private int[] transferAndSort(String[] data) {
		int[] intData = new int[data.length];
		for (int i = 0; i < data.length; i++) {
			intData[i] = Integer.parseInt(data[i]);
		}
		Arrays.sort(intData);
		return intData;
	}
	private String intArrayToString(int[] data, String flag) {
		StringBuffer buffer = new StringBuffer();
		for (int d : data) {
			buffer.append(d).append(flag);
		}
		return buffer.toString();
	}
	public static void main(String[] args) {
		new SortServer().work();
	}
}

  Socket客户端方法实例:
  步骤:定义属性host和port连接服务器:socket(host,port)InputStream,OutputStream读写数据close关闭连接。
  例2:

public class SortClient {
	private String host = "localhost";
	private int port = 8888;
	source有参和无参构造方法。
	public void sort(){
		Socket socket = null;
		Scanner scanner = null;
		InputStream inputStream = null;
		OutputStream outputStream = null;
		try {
			socket = new Socket(host,port);
			inputStream = socket.getInputStream();
			outputStream = socket.getOutputStream();
			scanner = new Scanner(System.in);
			String intsString = scanner.nextLine();
			outputStream.write(intsString.getBytes());
			byte[] buffer = new byte[512];
			int len = inputStream.read(buffer);
			String string = new String(buffer,0,len);
			System.out.println("排序后数据:"+string);
		} catch (UnknownHostException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		} finally{
			clossAll(scanner, outputStream, inputStream, socket);
			clossAll是自己构造的关闭连接方法
		}
	}
	public static void main(String[] args) {
		String host = "localhost";
		int port = 8888;
		new SortClient(host,port).sort();
	}
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值