Java 网络编程

网络编程

  • 网络编程:进行服务器端与客户端编程的开发操作实现。

  • java.net:网络操作包

B/S结构:

  • 浏览器/服务器模式(Browser/Server)

    • 不在开发客户端代码

      • 开发一套服务器端的程序代码
      • 客户端利用浏览器进行访问
    • 维护方便,安全性能低(使用公共的HTTP协议和80端口)

C/S结构:

  • 客户端/服务器模式(Client / Server)

    • 需要编写两套程序:

      • 客户端程序代码
      • 服务器程序代码
    • C/S的开发非常的繁琐,因为开发人员需要维护两套程序。(运维哭)

    • 优点:安全性能高;使用的是自己的连接端口、通信协议

TCP程序:

  • 面向连接的可靠性传输

UDP程序:

  • 面向无连接的不可靠的传输

C/S_ 网络程序

核心开发类:

  • 服务端类:ServerSocket

    • 工作在服务器端,用于接收用户的请求
  • 客户端类:Socket
    • 每一个连接到服务器端上的用户都通过Socket表示

ServerSocket:服务器端

public class ServerSocket
extends Object
implements Closeable
  • 构造方法:
public ServerSocket(int port) throws IOException;

参数:port ==> 设置监听信息包的端口号

  • 接收连接(来自客户端的连接)(Socket类定义的方法)
public Socket accept() throws IOException;
  • 设置输出数据(Socket类定义的方法;套接字的输出流)
public OutputStream getOutputStream() throws IOException;

Socket:客户端

public class Socket
extends Object
implements Closeable
  • 构造方法
public Socket(String host , int port);

连接主机的IP或域名(本机:localhost/127.0.0.1),并定义通信端口号port

套接字(也可以就叫“套接字”)。套接字是两台机器间通信的端点。

  • 得到输入数据(套接字的输入流)
public InputStream getInputStream();
  • 设置输出数据(Socket类定义的方法;套接字的输出流)
public OutputStream getOutputStream() throws IOException;

套接字的输入输出流:在客户端套接字的输入流获取服务端的套接字的输出流

开发实例

  • 服务器端:Server
import java.io.IOException;
import java.io.PrintStream;
import java.net.ServerSocket;
import java.net.Socket; // c/s ==> 服务端 public class Server {
public static void main(String[] args) throws IOException {
ServerSocket server = new ServerSocket(1024);// 端口号 port
// 连接客户端
System.out.println(">>> 等待客户端连接 ... <<<");
Socket client = server.accept();//等待客户端发来连接请求
PrintStream out = new PrintStream(client.getOutputStream());
// 利用打印流完成输出,向客户端输出信息;
// client.getOutputStream()返回的是输出流的对象
out.println("Hello,World!");
out.close();
client.close();
server.close();
}
}
  • 客户端:Client
import java.io.IOException;
import java.net.Socket;
import java.net.UnknownHostException;
import java.util.Scanner; // c/s ==> 客户端
public class Client {
public static void main(String[] args) throws UnknownHostException, IOException {
Socket client = new Socket("localhost",1024); // 连接服务端
// 取得客户端的输入数据流对象 ==> 接收来自服务器端的输出信息(流)
Scanner scan = new Scanner(client.getInputStream());
// client.getInputStream()返回的是输入流的对象
scan.useDelimiter("\n");
if (scan.hasNext()) {
System.out.println(scan.next());
}
scan.close();
client.close();
}
}

Echo 程序开发模型(经典案例)

客户端随意的向服务器端输送信息,服务端接收信息后,在信息前面加上 “ECHO” 标记后返回。

  • 服务端
public class EchoServer {
public static void main(String [] args) throws Exception{
ServerSocket server = new ServerSocket(512);
Socket client = server.accept();//接收客户端的连接
Scanner scan = new Scanner(client.getInputStream());//接收套接字输入流(对象)
PrintStream out = new PrintStream(client.getOutputStream());//设置套接字输出流(对象)
scan.useDelimiter("\n");
System.out.println(">>> 连接准备 <<<");
boolean flag = true ; //控制连接的结束
while (flag) {
if (scan.hasNext()) {
String str = scan.next() ; //客户端发送的内容
if (str.equalsIgnoreCase("bye")) {
flag = false;
out.println("bye!");
} else {
out.println("ECHO:" + str);
}
}
}
client.close();
out.close();
server.close();
scan.close();
}
}
  • 客户端
public class EchoClient {
public static void main(String[] args) throws UnknownHostException, IOException {
Socket client = new Socket("localhost",512);
Scanner scan = new Scanner(client.getInputStream());
PrintStream out = new PrintStream(client.getOutputStream());
Scanner in = new Scanner(System.in);// 利用扫描流从键盘输入
in.useDelimiter("\n");
scan.useDelimiter("\n");
boolean flag = true;
while (flag) {
if (in.hasNext()) {
String str = in.next();//获取数据(输入数据)
out.println(str);
if(str.equalsIgnoreCase("bye")) {
flag = false ;
}
if(scan.hasNext()) {
System.out.println(scan.next());
}
}
}
client.close();
scan.close();
out.close();
in.close();
}
}

服务开发的基础要素:网络支持类、IO、多线程

最新文章

  1. JavaScripts 基础详细笔记整理
  2. 160906、Dubbo与Zookeeper、SpringMVC整合和使用(负载均衡、容错)
  3. Linux环境下MySQL使用入门
  4. CentOS 卸载已安装软件
  5. Android通过代码获取View
  6. &lt;顶&gt;vim快捷键映射Map使用
  7. 通过公网连接云数据库Memcache--ECS Windows篇
  8. xml中报错,验证是否是xml报错
  9. A - 高精度(大数)N次方(第二季水)
  10. Berkeley DB基础教程
  11. (转载)QT中PRO文件写法的详细介绍,很有用,很重要!
  12. WebStorm 10.0.3安装
  13. xBIM WeXplorer 设置模型颜色
  14. django静态模版使用
  15. Android中是否推荐使用枚举Enum
  16. FIFO的使用总结
  17. J - FatMouse&#39;s Speed
  18. 20155209 Exp5 MSF基础应用
  19. Spring 集成 redistemplate
  20. 更改MySQL数据库目录位置[zz]

热门文章

  1. JPA中实现双向一对一的关联关系
  2. selenium的安装、报错和解决
  3. 【转】浅谈命令查询职责分离(CQRS)模式
  4. 加快C++代码的编译速度方法【转载】
  5. 使用mysql-proxy实现mysql的读写分离
  6. SpringBoot+idea搭建微服务简化流程
  7. idea个性化配置
  8. PHP $_SERVER超全局变量详解
  9. 表单生成器(Form Builder)之伪造表单数据番外篇——指定范围随机时间
  10. 每天学点HTML01