C++程序员学Java系列之三五:一个简易的Client,Server样例
2017-07-25 17:30
537 查看
网络编程是指编写运行在多个设备(计算机)的程序,这些设备都通过网络连接起来。
java.net 包中 J2SE 的 API 包含有类和接口,它们提供低层次的通信细节。你可以直接使用这些类和接口,来专注于解决问题,而不用关注通信细节。
java.net 包中提供了两种常见的网络协议的支持:
TCP:TCP 是传输控制协议的缩写,它保障了两个应用程序之间的可靠通信。通常用于互联网协议,被称 TCP / IP。
UDP:UDP 是用户数据报协议的缩写,一个无连接的协议。提供了应用程序之间要发送的数据的数据包。
java.net.Socket 类代表一个套接字,并且 java.net.ServerSocket 类为服务器程序提供了一种来监听客户端,并与他们建立连接的机制。
以下步骤在两台计算机之间使用套接字建立TCP连接时会出现:
1)服务器实例化一个 ServerSocket 对象,表示通过服务器上的端口通信。
2)服务器调用 ServerSocket 类的 accept() 方法,该方法将一直等待,直到客户端连接到服务器上给定的端口。
3)服务器正在等待时,一个客户端实例化一个 Socket 对象,指定服务器名称和端口号来请求连接。
4)Socket 类的构造函数试图将客户端连接到指定的服务器和端口号。如果通信被建立,则在客户端创建一个 Socket 对象能够与服务器进行通信。
5)在服务器端,accept() 方法返回服务器上一个新的 socket 引用,该 socket 连接到客户端的 socket。
样例
服务端代码:
server
该种应用形式的缺点很明显:
服务器虽然在线程中启动,没有阻塞主线程,但不能并发,只有处理完一个客户端的连接才能处理下一个客户端的连接;
java.net 包中 J2SE 的 API 包含有类和接口,它们提供低层次的通信细节。你可以直接使用这些类和接口,来专注于解决问题,而不用关注通信细节。
java.net 包中提供了两种常见的网络协议的支持:
TCP:TCP 是传输控制协议的缩写,它保障了两个应用程序之间的可靠通信。通常用于互联网协议,被称 TCP / IP。
UDP:UDP 是用户数据报协议的缩写,一个无连接的协议。提供了应用程序之间要发送的数据的数据包。
java.net.Socket 类代表一个套接字,并且 java.net.ServerSocket 类为服务器程序提供了一种来监听客户端,并与他们建立连接的机制。
以下步骤在两台计算机之间使用套接字建立TCP连接时会出现:
1)服务器实例化一个 ServerSocket 对象,表示通过服务器上的端口通信。
2)服务器调用 ServerSocket 类的 accept() 方法,该方法将一直等待,直到客户端连接到服务器上给定的端口。
3)服务器正在等待时,一个客户端实例化一个 Socket 对象,指定服务器名称和端口号来请求连接。
4)Socket 类的构造函数试图将客户端连接到指定的服务器和端口号。如果通信被建立,则在客户端创建一个 Socket 对象能够与服务器进行通信。
5)在服务器端,accept() 方法返回服务器上一个新的 socket 引用,该 socket 连接到客户端的 socket。
样例
服务端代码:
import java.io.DataInputStream; import java.io.DataOutputStream; import java.io.IOException; import java.net.ServerSocket; import java.net.Socket; import java.net.SocketTimeoutException; public class Server extends Thread { private ServerSocket server; public Server(int port) throws IOException { server = new ServerSocket(port); server.setSoTimeout(10000);//设置10s超时,自动退出 } public void run(){ while (true){ System.out.println("waiting for client on port "+server.getLocalPort()+"..."); try { // 阻塞接收客户端的连接 Socket s = server.accept(); //如果有连接就打印连接信息 System.out.println("连接信息:"+ s.getRemoteSocketAddress() ); // 获取服务端的输入流 DataInputStream in = new DataInputStream(s.getInputStream()); System.out.println(in.readUTF()); // 写回信息给客户端 DataOutputStream out = new DataOutputStream(s.getOutputStream()); out.writeUTF("server reply: "+s.getLocalSocketAddress() + "... Goodbye!"); //关闭 s.close(); }catch(SocketTimeoutException timeout){ System.out.println("socket timed out!"); break; } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); break; } } } public static void main(String[] args) { // TODO Auto-generated method stub int port = 6666; try { Thread t = new Server(port); t.start(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } }客户端代码:
import java.io.DataInputStream; import java.io.DataOutputStream; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.net.Socket; public class Client { public static void main(String[] args) { // TODO Auto-generated method stub String name = "127.0.0.1"; int port = 6666; try { System.out.println("连接服务器["+name+"],端口:"+ port); Socket client = new Socket(name, port); // 获取连接状态 System.out.println("连接状态:"+ client.getRemoteSocketAddress()); // 客户端输出 OutputStream outToServer = client.getOutputStream(); DataOutputStream out = new DataOutputStream(outToServer); out.writeUTF("Hello from " + client.getLocalSocketAddress()); // 客户端输入 InputStream inFromServer = client.getInputStream(); DataInputStream in = new DataInputStream(inFromServer); System.out.println("Server says: " + in.readUTF()); // 关闭 client.close(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } }输出:
server
waiting for client on port 6666... 连接信息:/127.0.0.1:4889 Hello from /127.0.0.1:4889 waiting for client on port 6666... socket timed out!client
连接服务器[127.0.0.1],端口:6666 连接状态:/127.0.0.1:6666 Server says: server reply: /127.0.0.1:6666... Goodbye!
该种应用形式的缺点很明显:
服务器虽然在线程中启动,没有阻塞主线程,但不能并发,只有处理完一个客户端的连接才能处理下一个客户端的连接;
相关文章推荐
- java 和 C++ Socket通信(java作为服务端server,C++作为客户端client,解决中文乱码问题GBK和UTF8)
- C++程序员如何向一个java工程师解释何为reference引用?
- C++程序员如何向一个java工程师解释extern "C"的作用
- Thrift多语言,Server(C++) Client(Java)
- C++语言基础 —— 一个Java程序员的视角
- C++程序员进军Android系列:C++跟JAVA的区别总结
- C++程序员学Java系列之二: Java开发环境概述
- C++程序员学Java系列之四:Java中的关键字和标识符
- 一个java网络编程Socket的例子,实现Server与Client聊天
- C++程序员学Java系列之七:Scanner类 和 引用数据类型
- C++程序员学Java系列之三: 从Hello World! 开始
- 基于C++的纯面向对象的通用高性能大并发TCP-SERVER/CLIENT开发框架实践系列之基础篇
- C++程序员如何向一个java工程师解释何为reference引用?
- 一个程序员的Java和C++学习之路(转)
- java 和 C++ Socket通信(java作为服务端server,C++作为客户端client,解决中文乱码问题GBK和UTF8)
- java 和 C++ Socket通信(java作为服务端server,C++作为客户端client,解决中文乱码问题GBK和UTF8)
- java 和 C++ Socket通信(java作为服务端server,C++作为客户端client,解决中文乱码问题GBK和UTF8)
- java 和 C++ Socket通信(java作为服务端server,C++作为客户端client,解决中文乱码问题GBK和UTF8)
- thrift C++做server, C++,python, java做Client例子
- 一个Java程序员是如何转向C++的 -- 前言