小知识点:

    网络编程:主要解决计算机间数据传输
    不需要html页面可以达到数据传输:QQ,微信
    网页编程:继续Html页面基础上数据交互:OA,天猫。。。

    java方向:web方向,annrod常用Socket方式传输

    计算机网路:分布在不同地域的计算机通过外部设备传输数据

    网路通讯三要素:IP,端口号(哪个应用程序使用),协议

    IP地址分类:网路号,主机号;子网掩码是标明哪个是网络号
      A类地址:一个网络号+三个主机号 政府单元2^24个
      B类地址:2+2 事业单位(学校,银行)2^16
      C类地址:3+1 私人使用2^8

    InetAddress类(IP类)

    服务器集群:一个计算机访问百度,在对象的电信dns服务器中可能有多个,每个又有很多子服务器,后来的那么多服务器集合叫服务器集群

    端口号:0~2^16-1;0~1023:系统紧密绑定一些服务
        1024~65535:我们可以使用;1024是个分界点
    网络通讯的协议:
      UDP:不需要建立连接通讯
      TCP:需要建立连接的通讯

1.UDP
  什么时候数据可能丢失:
    a.带宽不足b.cpu不足
  用法:a.建DatagramSocket
      b.DatagramPacket封装数据为数据包(数据包大小64kb,该有的信息都有)
      c.发送数据:.send();;接收数据receive();
  例子:
    基本例子:
    发送端:
    DatagramSocket ds=new DatagramSocket();
    String content="你好,我是第一次使用udp!";
    //装载数据
    DatagramPacket dp=new DatagramPacket(content.getBytes(),content.getBytes().length,InetAddress.getLocalHost(),1025);
    //发送数据
    ds.send(dp);
    ds.close();

    接收端
    DatagramSocket sd=new DatagramSocket(1025);
    byte[] buffer=new byte[1024];
    DatagramPacket dp=new DatagramPacket(buffer,buffer.length);
      while(true){
        sd.receive(dp);
        System.out.println(new String(buffer,0,dp.getLength()));
        Thread.sleep(1000);
      }

    群聊例子:
    这个分三个类:一个发送,一个接收,一个主程序(用到的是多线程编程)
    发送发:
    //群聊发送端

public class ChatSender extends Thread {

    @Override
public void run() {
try {
//建立udp的服务
DatagramSocket socket = new DatagramSocket();
//准备数据,把数据封装到数据包中发送
BufferedReader keyReader = new BufferedReader(new InputStreamReader(System.in));
String line = null;
DatagramPacket packet = null;
while((line = keyReader.readLine())!=null){
//把数据封装 到数据数据包中,然后发送数据。
packet = new DatagramPacket(line.getBytes(), line.getBytes().length, InetAddress.getByName("192.168.15.255"), 9090);
//把数据发送出去
socket.send(packet);
}
//关闭 资源
socket.close();
} catch (IOException e) {
e.printStackTrace();
}
} }

//群聊接收端

public class ChatReceive extends Thread {

    @Override
public void run() {
try {
//建立udp的服务,要监听一个端口
DatagramSocket socket = new DatagramSocket(9090);
//准备空的数据包存储数据
byte[] buf = new byte[1024];
DatagramPacket packet = new DatagramPacket(buf, buf.length);
boolean flag = true;
while(flag){
socket.receive(packet); }
//关闭资源
socket.close(); }catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} } }
 System.out.println("客户端接收到的数据是:"+new String(buf,0,buf.length));这段输出代码需要加上

     //主程序

public static void main(String[] args) {
ChatReceive chatReceive = new ChatReceive();
chatReceive.start(); ChatSender chatSender = new ChatSender();
chatSender.start(); }

2.TCP
    问题:为什么Service为是么不设计一个getInputStream,getOutputStream
      因为服务端会接收多个客户端,对应的输入输出流就不好找了,唯一性的只有客户端的Socket才是唯一能确定连接服务端的
    用法:客务端:a.建立Socket连接
            b.获得输出流
            c.关闭连接
       服务端:a.建立监听连接
            b.等待客户端请求连接
            c.获取对应的输入输出流
            d。挂壁资源
    例子:
                 a.基础例子:
客户端:

/**
* tcp客户端
* 1.建立Socket连接
* 2.获得输出流
* 3.关闭连接
* @author Administrator
*
*/
public class tcpClient { public static void main(String[] args) throws IOException {
// TODO Auto-generated method stub
Socket socket=new Socket(InetAddress.getLocalHost(),2000);
//获得输出流
java.io.OutputStream outputStream = socket.getOutputStream();
outputStream.write("这是你的tcp文件".getBytes()); //获取到输入流对象,读取服务端回送的数据。
java.io.InputStream inputStream = socket.getInputStream();
byte[] buf = new byte[1024];
int length = inputStream.read(buf);
System.out.println("客户端接收到的数据:"+ new String(buf,0,length));
socket.close();
} }

服务端

/**
* tcp服务端
* 1.建立监听连接
* 2.等待客户端请求连接
* 3.获取对应的输入输出流
* 4。挂壁资源
* @author Administrator
*
*/
public class tcpService { public static void main(String[] args) throws IOException {
ServerSocket ss=new ServerSocket(2000);
Socket s=ss.accept(); //获取Socket中的输入流
InputStream inputStream=s.getInputStream();
byte[] buf = new byte[1024];
int length = 0;
length = inputStream.read(buf);
System.out.println("服务端接收:"+ new String(buf,0,length)); //获取socket输出流对象,想客户端发送数据
OutputStream outputStream = s.getOutputStream();
outputStream.write("客户端你好啊!".getBytes()); //关闭资源
ss.close();
} }

b.客户端与服务端一问一答聊天。
        1.如果使用BuffrerdReader的readline方法一定要加上\r\n才把数据写出。
        2.使用字符流一定要调用flush方法数据才会写出。
聊天的客户端

public class ChatClient {

    public static void main(String[] args) throws IOException {
//建立tcp的客户端服务
Socket socket = new Socket(InetAddress.getLocalHost(),9090);
//获取socket的输出流对象。
OutputStreamWriter socketOut = new OutputStreamWriter(socket.getOutputStream());
//获取socket的输入流对象
BufferedReader socketReader = new BufferedReader(new InputStreamReader(socket.getInputStream())); //获取键盘的输入流对象,读取数据
BufferedReader keyReader = new BufferedReader(new InputStreamReader(System.in)); String line = null;
//不断的读取键盘录入的数据,然后把数据写出
while((line = keyReader.readLine())!=null){
socketOut.write(line+"\r\n");
//刷新
socketOut.flush(); //读取服务端回送的数据
line = socketReader.readLine();
System.out.println("服务端回送的数据是:"+line);
}
//关闭资源
socket.close();
} }

聊天的服务端

public class ChatServer {

    public static void main(String[] args) throws IOException {
//建立tcp的服务端
ServerSocket serverSocket = new ServerSocket(9090);
//接受客户端的连接,产生一个SOcket
Socket socket = serverSocket.accept();
//获取到Socket的输入流对象
BufferedReader socketReader = new BufferedReader(new InputStreamReader(socket.getInputStream())); //获取到Socket输出流对象
OutputStreamWriter socketOut = new OutputStreamWriter(socket.getOutputStream()); //获取键盘的输入流对象
BufferedReader keyReader = new BufferedReader(new InputStreamReader(System.in)); //读取客户端的数据
String line = null;
while((line = socketReader.readLine())!=null){
System.out.println("服务端接收到的数据:"+ line); System.out.println("请输入回送给客户端的数据:");
line = keyReader.readLine();
socketOut.write(line+"\r\n");
socketOut.flush();
} //关闭资源
serverSocket.close();
} }

      c.模拟Tomcat服务器

public class TomcatDemo extends Thread {

    Socket socket;

    public TomcatDemo(Socket socket){
this.socket = socket;
} public void run() {
try {
//获取socket的输出流对象
OutputStream outputStream = socket.getOutputStream();
//把数据写到浏览器上
outputStream.write("<html><head><title>aaa</title></head><body>你好啊浏览器</body></html>".getBytes());
socket.close();
} catch (IOException e) {
e.printStackTrace();
}
} public static void main(String[] args) throws IOException {
//建立tcp的服务端
ServerSocket serverSocket = new ServerSocket(9090);
//不断的接受客户端的连接
while(true){
Socket socket = serverSocket.accept();
new TomcatDemo(socket).start();
}
} }

作业:
1. 编写一个服务端可以给多个客户端发送图片。 (多线程)

2. 实现登陆与注册 功能。
客户端与服务端连接的时候,就要提示客户端请选择功能。

客户端注册的时候,用户名与密码都是发送给服务端 的,服务端需要把数据保存到服务端的文件上。

登陆: 登陆的时候客户端输入用户名与密码发送给服务端,服务端需要校验,返回结果给客户端。

java入门了解13的更多相关文章

  1. JAVA入门[13]-Spring装配Bean

    一.概要 Sping装配bean主要有三种装配机制: 在XML中进行显式配置. 在Java中进行显式配置. 隐式的bean发现机制和自动装配. 原则: 建议尽可能地使用自动配置的机制,显式配置越少越好 ...

  2. Java入门的程序汇总

    Java入门的基础程序,虽然很简单,也要多练习,下面有重点的总结一下 1.HelloWorld这个不说了 2.常量与变量部分 基本数据类型使用 public class Javashujuleixin ...

  3. JAVA入门--目录

    在此记录自己的JAVA入门笔记,备忘 JAVA入门[1]--安装JDK JAVA入门[2]-安装Maven JAVA入门[3]—Spring依赖注入 JAVA入门[4]-IntelliJ IDEA配置 ...

  4. Java入门:注册模块的实现

    1.主活动图 用户选择注册选项,进入注册界面,开始输入注册信息,到最后完成注册.具体的活动图如下: 以上活动图中,矩形框里的操作不是在一个类里面实现的,而是通过Form类和UserService类来实 ...

  5. java入门概念梳理总结

    Java入门学习 简介 public class HelloWorld { public static void main(String []args) { System.out.println(&q ...

  6. Java入门(4)

    阅读书目:Java入门经典(第7版) 作者:罗格斯·卡登海德 面向对象编程(OOP)将程序视为对象的集合,确定程序要完成的任务,然后将这些任务指派给最适合完成它们的对象.换言之,计算机程序是一组对象, ...

  7. Java入门基础知识点总结(详细篇)

    Java入门基础知识点总结(详细篇)~~~~~目录 1.1 图解 1.1.1 Java基础知识点 1.1.2 Java基础语法的相关内容 1.2 关键字 1.3 标识符 1.3.1 标识符概念 1.3 ...

  8. 测试人员学Java入门指南

    目标读者 本指南特别适合有Python基础的同学学习Java入门,对于没有任何编程经验的同学可能会存在困难. 为什么测试人员要学Java 选择Java,应该不错.TesterHome测试论坛知名大佬基 ...

  9. Java入门第一章

    后天就是十一长假了,亲们准备好了去哪儿玩了吗? 今天有点空,就来聊聊Java吧,当然是一些Java入门知识了,网上有很多,这里我只是列举一些我自己学到的,感谢大家关注喵的博客这么久,也为大家带来点新知 ...

随机推荐

  1. StringUtils工具类详解

    StringUtils判断字符串大概有四种方法: 下面是 StringUtils 判断是否为空的示例: 判断是否为空,但是要注意,空格不算空,这个最好能不用则不用. StringUtils.isEmp ...

  2. 利用python 掌握机器学习的过程

    转载:http://python.jobbole.com/84326/ 偶然看到的这篇文章,觉得对我挺有引导作用的.特此跟大家分享一下. 为了理解和应用机器学习技术,你需要学习 Python 或者 R ...

  3. 计算机图形学(二)输出图元_6_OpenGL曲线函数_2_中点画圆算法

    中点画圆算法        如同光栅画线算法,我们在每一个步中以单位间隔取样并确定离指定圆近期的像素位置.对于给定半径r和屏幕中心(xc,yc),能够先使用算法计算圆心在坐标原点(0, 0)的圆的像素 ...

  4. getOutputStream() has already been called for this response的解决方法

    1.问题描述:spring mvc中下载文件结束后,跳转到list页面,问题报上面的异常. 2.原因:写文件的时候response调用一次,在跳转的时候,spring调用ActionForward类中 ...

  5. 微信公众号开发---上传临时素材到公众号遇到的问题:"errcode":41005,"errmsg":"media data missing

    1.上传临时素材到公众号遇到的问题:"errcode":41005,"errmsg":"media data missing 解决办法:因为php版本 ...

  6. 【SQLServer2008】之Win10 安装 SQL Server 2008

    查看安装步骤链接: http://jingyan.baidu.com/article/1709ad8092be974634c4f0e7.html

  7. GitHub 寻宝指南

    GitHub 寻宝指南 寻找 Demo 技术栈的关键字搜索,并按更新时间进行排序 生命有限 ,如若是每次我们尝试一个新的技术,总得自己编写一个个 Demo.编写多个 Demo,都得花去个半天八小时的时 ...

  8. UVa 10651 Pebble Solitaire(DP 记忆化搜索)

    Pebble Solitaire Pebble solitaire is an interesting game. This is a game where you are given a board ...

  9. oracle img 导入dmp文件

    1.新建表空间 因为我们导出的数据表的表空间不一定是USERS, 假如说是:FQDB 新建表空间SQL语句 create tablespace FQDB datafile 'c:\FQDB.dbf' ...

  10. OSI模型第三层网络层-初识路由协议

    1.路由协议: 顾名思义就是路由器所使用的协议. 分类: (1)按照作用范围分类,IGP(类型)内部网关协议(rip,ospf,isis),EGP(类型)边界路由协议(bgp) 把互联网比作整个世界土 ...