[零基础学JAVA]Java SE应用部分-32.Java网络编程
|- MSN、QQ:一般会有两套程序,一个是服务器端,另外一个是客户端
B/S程序:表示的浏览器/ 服务器,可以理解为动态WEB,论坛
数据报:UDP通讯
1、所有的用户对于服务器来讲都是一个Socket客户端。
2、在服务器上使用ServerSocket类接收客户端的Socket
public ServerSocket(int port)
public Socket accept() throws IOException
但是一般情况下,很少说直接去使用telnet连接,往往会编写一个客户端。
Socket
public Socket(String host,int port) throws UnknownHostException,IOException
指定一个主机的IP地址和一个端口
· 一个是服务器端
· 另外一个是客户端
这样的做法我们可以做一个Socket经典 —— Echo程序
用户发什么内容,服务器就会回应什么内容:
import java.net.*;
public class EchoServer{
//此处为了省去处理try...catch直接抛出了异常
public static void main(String args[]) throws Exception{
ServerSocket server = null;
//输出肯定使用打印流
PrintStream out = null;
//服务器肯定也要接收输入
BufferedReader buf = null;
//1.实例化一个服务器的监听端
server = new ServerSocket(9999);
//可以使用一种死循环的方式接收内容
Socket client = null;
while (true){
//不断接收内容
client = server.accept();
//准备好向客户端输出内容
out = new PrintStream(client.getOutputStream());
//而且客户端要有输入给服务器端
buf = new BufferedReader(new InputStreamReader(client.getInputStream()));
//下面先给出一个完整的信息提示
out.println("您好!欢迎光临:http://redking.blog.51cto.com");
out.println("输入bye表示退出哈~");
//一个用户要发很多的信息
while (true){
//接收客户端发送而来的内容
String str = buf.readLine();
if (str==null){
//如果str为空就表示退出
break;
}else{
//如果输入的是bye则表示系统退出
if ("bye".equals(str)){
break;
}
//可以对用户发来的信息进行回应
out.println("ECHO:"+str);
}
}
//进行收尾工作
out.close();
buf.close();
client.close();
//如果要关闭服务器时可以设置标志
//server.close();
}
}
}
import java.net.*;
public class EchoClient{
public static void main(String args[]) throws Exception{
Socket client = null;
BufferedReader buf = null;
PrintStream out = null;
//1.连接服务器
client = new Socket("localhost",9999);
//接收服务器端的输入信息
buf = new BufferedReader(new InputStreamReader(client.getInputStream()));
System.out.println(buf.readLine());
System.out.println(buf.readLine());
//之后准备从键盘接收数据
BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
String userInput = null;
out = new PrintStream(client.getOutputStream());
while ((userInput=in.readLine())!=null){
//表示有内容进来,要把内容发送到客户端
out.println(userInput);
//接收服务器端的回应
System.out.println(buf.readLine());
}
out.close();
in.close();
client.close();
}
}
程序是单线程的,所以每次只能一个用户访问。
此处如果想解决,则只能使用多线程进行操作。
首先需要编写一个线程的类:
import java.net.*;
public class ThreadServer implements Runnable{
//现在所有的Socket都要归入到一个线程之中
private Socket client = null;
public ThreadServer(Socket client){
this.client = client;
}
public void run(){
//要不断的接收客户发送来的信息
String input = null;
//通过BufferedReader进行接收
BufferedReader buf = null;
//有一个输出的对象
PrintStream out = null;
try{
buf = new BufferedReader(new InputStreamReader(this.client.getInputStream()));
while(true){
//接收发送过来的信息
input = buf.readLine();
out = new PrintStream(this.client.getOutputStream());
if ("bye".equals(input)){
break;
}else{
out.println("ECHO:"+input);
}
}
this.client.close();
}catch (Exception e){}
}
}
import java.net.*;
public class EchoServer01{
//此处为了省去处理try...catch直接抛出了异常
public static void main(String args[]) throws Exception{
ServerSocket server = null;
//输出肯定使用打印流
PrintStream out = null;
//服务器肯定也要接收输入
BufferedReader buf = null;
//1.实例化一个服务器的监听端
server = new ServerSocket(9999);
//可以使用一种死循环的方式接收内容
Socket client = null;
while (true){
//不断接收内容
client = server.accept();
//在此处启动了一个线程
new Thread(new ThreadServer(client)).start();
}
}
}
服务器 = 多线程 + IO + Socket
Socket程序实际上是属于TCP程序,是一个稳定的连接
import java.net.*;
public class Send{
public static void main(String args[]) throws Exception{
DatagramSocket ds = null;
DatagramPacket dp = null;
//发送端必须有一个监视的端口
ds = new DatagramSocket(9999);
String str = "http://redking.blog.51cto.com";
//发送的内容只能是byte数组
//接收端端口号是8888
dp = new DatagramPacket(str.getBytes(),str.length(),InetAddress.getByName("localhost"),8888);
ds.send(dp);
ds.close();
}
}
import java.net.*;
public class Receive{
public static void main(String args[]) throws Exception{
DatagramSocket ds = null;
DatagramPacket dp = null;
//要有一个空间大小
byte b[] = new byte[1024];
//ds的监听端口就表示发送端指定好的
ds = new DatagramSocket(8888);
dp = new DatagramPacket(b,b.length);
//开始接收
ds.receive(dp);
System.out.println(new String(dp.getData()).trim());
ds.close();
}
}
网络编程在实际中确实使用越来越少,JAVA的主要特点全部集中在了JAVA WEB上了。
只需要了解以下概念即可:
· 网络程序的分类:TCP、UDP
· 服务器 = IO + Socket + Thread
转载于:https://blog.51cto.com/redking/135374
[零基础学JAVA]Java SE应用部分-32.Java网络编程相关推荐
- 零基础学python难_0基础学python有多难
相对于其他编程语言来说,Python并不是很难,入门简单,容易上手,对于零基础的人来说,入门Python是不难的,但是想要学精学通,则要花费一定的时间和精力.Python是主流的编程语言,应用性非常高 ...
- [零基础学JAVA]Java SE实战开发-37.MIS信息管理系统实战开发[JDBC](1)
MIS信息管理系统实战开发之使用MySQL实现保存 开发背景 ID.姓名.年龄为公共信息,而学生有成绩,工人有工资 定义一个抽象类Person(ID.姓名.年龄),学生是其子类,有成绩,工人是其子类有 ...
- [零基础学JAVA]Java SE实战开发-37.MIS信息管理系统实战开发[文件保存](1)
MIS信息管理系统实战开发之单独使用文件实现保存 开发背景 ID.姓名.年龄为公共信息,而学生有成绩,工人有工资 定义一个抽象类Person(ID.姓名.年龄),学生是其子类,有成绩,工人是其子类有工 ...
- java无线电台RS制信号_中国MOOC_零基础学Java语言_第2周 判断_2信号报告
2 信号报告(5分) 题目内容: 无线电台的RS制信号报告是由三两个部分组成的: R(Readability) 信号可辨度即清晰度. S(Strength) 信号强度即大小. 其中R位于报告第一 ...
- 零基础学java培训怎么选择学校
java技术在互联网行业的快速发展,引起了很多人的关注,大家都想通过学习java技术来加入到这个行业,那么零基础学java培训怎么选择学校呢?如今市面上的java培训机构这么多,下面小编就来为大家详细 ...
- 零基础学Java需要做哪些准备
想要成为一名合格的java工程师,那么好好学习java技术是非常重要的,对于零基础同学们来说,大家比较关注的就是"零基础学Java需要做哪些准备"这个问题,下面小编就来为大家做下详 ...
- 零基础学Java大数据难不难
java大数据如今在企业中用到的次数是非常多的,很多人都比较看好java技术,那么零基础学Java大数据难不难?想要学习java技术说难不难,说简单也不是很简单,来看看下面的详细介绍就知道了. 零基础 ...
- 零基础学Java程序有什么好的建议
java技术的快速发展,引起了很多人的关注,尤其是一些零基础人群,都想通过学习java技术来改善自己的职业,那么零基础学Java程序有什么好的建议呢?来看看下面的详细介绍. 零基础学Java程 ...
- 零基础学怎么学Java_零基础学java难么?怎么自学?
在计算机发展迅速的今天,越来越多的人去学习编程,其中Java就是大家热衷的语言之一.这时候就有人问,零基础学java难么?下面小编将回答这一问题并给出学习路线. 小编想说,这个实际上要看个人能力以及前 ...
- 零基础学Java需要先具备的三项技能
随着互联网的发展,许多公司都在招Java工程师,很多零基础的Java小白看中了Java的高薪资,也都想转行做Java,但是零基础学Java需要先具备哪些技能呢?本文小千整理了零基础学Java需要先具备 ...
最新文章
- 学历对程序员重要么?
- 认识J2EE规范或标准以及J2EE和JEE有什么不同?
- Spark-shell提示找不到路径
- expected initializer before
- 超详细前端开发案例:品优购商场项目(二)
- vscode二次开发_vscode 扩展开发从入门到颈椎病康复
- JavaScript:indexOf()方法
- 记一次maven打包命令及指定pom文件
- 网管必备知识全套=做为一个网管必备的基础知识
- 经典6位半HP34401A电路图
- Ego的MyBatis框架笔记
- 中央预算单位银行账户管理系统单机版2021--运行环境配置指南
- Canvas-2d fillRect
- Hark的数据结构与算法练习之耐心排序
- 51NOD - 1677treecnt
- Android studio的下载和安装
- fpga卷积神经网络加速器,FPGA卷积神经网络综述
- STM32中断优先级管理
- 2021年跨境电商还值得做吗,怎么选择适合自己的电商平台
- 什么是 Azuki NFT 系列?