Java面向对象 网络编程 上



知识概要:

                    (1)网络模型

(2)网络通讯要素

(3)UDP TCP 概念

(4)Socket

(5)UDP TCP 传输

(6)编写一个聊天程序。

网络模型

         网络模型 

           

              • OSI参考模型

              • TCP/IP参考模型

网络通讯要素

 IP地址:InetAddress

•  网络中设备的标识

        • 不易记忆,可用主机名

        • 本地回环地址:127.0.0.1  主机名:localhost

 端口号

• 用于标识进程的逻辑地址,不同进程的标识

        • 有效端口:0~65535,其中0~1024系统使用或保留端口。

传输协议

• 通讯的规则 

       • 常见协议:TCP,UDP

TCP和UDP

 UDP

        • 将数据及源和目的封装成数据包中,不需要建立连接

        • 每个数据报的大小在限制在64k内

        •  因无连接,是不可靠协议

        • 不需要建立连接,速度快

  TCP 

       • 建立连接,形成传输数据的通道。 

       • 在连接中进行大数据量传输

       • 通过三次握手完成连接,是可靠协议

       • 必须建立连接,效率会稍低

Socket

  Socket就是为网络服务提供的一种机制。

  通信的两端都有Socket。

  网络通信其实就是Socket间的通信。

  数据在两个Socket间通过IO传输。

UDP传输

  DatagramSocket与DatagramPacket

  建立发送端,接收端。

   建立数据包。

调用Socket的发送接收方法。

 

关闭Socket。

发送端与接收端是两个独立的运行程序。

ip代码示例:

import java.net.*;

class  IPDemo
{
public static void main(String[] args) throws Exception
{
InetAddress i = InetAddress.getLocalHost(); System.out.println(i.toString());
System.out.println("address:"+i.getHostAddress());
System.out.println("name:"+i.getHostName()); InetAddress ia = InetAddress.getByName("thinkpad-sl400");
System.out.println("address:"+ia.getHostAddress());
System.out.println("name:"+ia.getHostName()); }
}

UDP传输

import java.net.*;

/*
需求:通过udp传输方式,将一段文字数据发送出去。,
定义一个udp发送端。
思路:
1,建立updsocket服务。
2,提供数据,并将数据封装到数据包中。
3,通过socket服务的发送功能,将数据包发出去。
4,关闭资源。 */ class UdpSend
{
public static void main(String[] args) throws Exception
{
//1,创建udp服务。通过DatagramSocket对象。
DatagramSocket ds = new DatagramSocket(8888); //2,确定数据,并封装成数据包。DatagramPacket(byte[] buf, int length, InetAddress address, int port) byte[] buf = "udp ge men lai le ".getBytes();
DatagramPacket dp =
new DatagramPacket(buf,buf.length,InetAddress.getByName("192.168.1.254"),10000); //3,通过socket服务,将已有的数据包发送出去。通过send方法。
ds.send(dp); //4,关闭资源。 ds.close(); }
} /*
需求:
定义一个应用程序,用于接收udp协议传输的数据并处理的。 定义udp的接收端。
思路:
1,定义udpsocket服务。通常会监听一个端口。其实就是给这个接收网络应用程序定义数字标识。方便于明确哪些数据过来该应用程序可以处理。
2,定义一个数据包,因为要存储接收到的字节数据。因为数据包对象中有更多功能可以提取字节数据中的不同数据信息。
3,通过socket服务的receive方法将收到的数据存入已定义好的数据包中。
4,通过数据包对象的特有功能。将这些不同的数据取出。打印在控制台上。
5,关闭资源。 */ class UdpRece
{
public static void main(String[] args) throws Exception
{
//1,创建udp socket,建立端点。
DatagramSocket ds = new DatagramSocket(10000);
while(true)
{
//2,定义数据包。用于存储数据。
byte[] buf = new byte[1024];
DatagramPacket dp = new DatagramPacket(buf,buf.length); //3,通过服务的receive方法将收到数据存入数据包中。
ds.receive(dp);//阻塞式方法。 //4,通过数据包的方法获取其中的数据。
String ip = dp.getAddress().getHostAddress(); String data = new String(dp.getData(),0,dp.getLength()); int port = dp.getPort(); System.out.println(ip+"::"+data+"::"+port); }
//5,关闭资源
//ds.close(); }
}
/*
编写一个聊天程序。
有收数据的部分,和发数据的部分。
这两部分需要同时执行。
那就需要用到多线程技术。
一个线程控制收,一个线程控制发。 因为收和发动作是不一致的,所以要定义两个run方法。
而且这两个方法要封装到不同的类中。 */
import java.io.*;
import java.net.*;
class Send implements Runnable
{
private DatagramSocket ds;
public Send(DatagramSocket ds)
{
this.ds = ds;
} public void run()
{
try
{
BufferedReader bufr = new BufferedReader(new InputStreamReader(System.in)); String line = null; while((line=bufr.readLine())!=null)
{ byte[] buf = line.getBytes(); DatagramPacket dp =
new DatagramPacket(buf,buf.length,InetAddress.getByName("192.168.1.255"),10002); ds.send(dp); if("886".equals(line))
break;
}
}
catch (Exception e)
{
throw new RuntimeException("发送端失败");
}
}
} class Rece implements Runnable
{ private DatagramSocket ds;
public Rece(DatagramSocket ds)
{
this.ds = ds;
}
public void run()
{
try
{
while(true)
{
byte[] buf = new byte[1024];
DatagramPacket dp = new DatagramPacket(buf,buf.length); <span style="color:#ff0000;"> ds.receive(dp);
</span> String ip = dp.getAddress().getHostAddress(); String data = new String(dp.getData(),0,dp.getLength()); if("886".equals(data))
{
System.out.println(ip+"....离开聊天室");
break;
} System.out.println(ip+":"+data);
}
}
catch (Exception e)
{
throw new RuntimeException("接收端失败");
}
}
} class ChatDemo
{
public static void main(String[] args) throws Exception
{
DatagramSocket sendSocket = new DatagramSocket();
DatagramSocket receSocket = new DatagramSocket(10002); new Thread(new Send(sendSocket)).start();
new Thread(new Rece(receSocket)).start(); }
}

TCP传输

Socket和ServerSocket

建立客户端和服务器端

 建立连接后,通过Socket中的IO流进行数据的传输,

关闭socket

同样,客户端与服务器端是两个独立的应用程序。

基本思路(客户端)

  客户端需要明确服务器的ip地址以及端口,这样才可以去试着建立连接,如果连接失败,会出现异常。

   连接成功,说明客户端与服务端建立了通道,那么  通过IO流就可以进行数据的传输,

而Socket对象已 经提供了输入流和输出流对象,通过 getInputStream(),getOutputStream()获取即可。

   与服务端通讯结束后,关闭Socket。

基本思路(服务端)

 服务端需要明确它要处理的数据是从哪个端口进入的。 

     当有客户端访问时,要明确是哪个客户端,可通过accept()获取已连接的客户端对象,并通过该对象与客户端通过

IO流进行数据传输。当该客户端访问结束,关闭该客户端。

客户端

通过Socket建立对象并指定要连接的服务

    端主机以及端口。

     Socket s = new Socket(“192.168.1.1”,9999);

     OutputStream out = s.getOutputStream();

     out.write(“hello”.getBytes());

     s.close();

服务端

 建立服务端需要监听一个端口

ServerSocket ss = new ServerSocket(9999);

     Socket s = ss.accept (); 

     InputStream in = s.getInputStream();

     byte[] buf = new byte[1024];

     int num = in.read(buf);

     String str = new String(buf,0,num);

     System.out.println(s.getInetAddress().toString()+”:”+str);

     s.close();

     ss.close();

/*
演示tcp传输。 1,tcp分客户端和服务端。
2,客户端对应的对象是Socket。
服务端对应的对象是ServerSocket。 */ /*
客户端,
通过查阅socket对象,发现在该对象建立时,就可以去连接指定主机。
因为tcp是面向连接的。所以在建立socket服务时,
就要有服务端存在,并连接成功。形成通路后,在该通道进行数据的传输。 需求:给服务端发送给一个文本数据。 步骤:
1,创建Socket服务。并指定要连接的主机和端口。 */
import java.io.*;
import java.net.*;
class TcpClient
{
public static void main(String[] args) throws Exception
{
//创建客户端的socket服务。指定目的主机和端口
Socket s = new Socket("192.168.1.254",10003); //为了发送数据,应该获取socket流中的输出流。
OutputStream out = s.getOutputStream(); out.write("tcp ge men lai le ".getBytes()); s.close();
}
} /*
需求:定义端点接收数据并打印在控制台上。 服务端:
1,建立服务端的socket服务。ServerSocket();
并监听一个端口。
2,获取连接过来的客户端对象。
通过ServerSokcet的 accept方法。没有连接就会等,所以这个方法阻塞式的。
3,客户端如果发过来数据,那么服务端要使用对应的客户端对象,并获取到该客户端对象的读取流来读取发过来的数据。
并打印在控制台。 4,关闭服务端。(可选) */
class TcpServer
{
public static void main(String[] args) throws Exception
{
//建立服务端socket服务。并监听一个端口。
ServerSocket ss = new ServerSocket(10003); //通过accept方法获取连接过来的客户端对象。
while(true)
{
Socket s = ss.accept(); String ip = s.getInetAddress().getHostAddress();
System.out.println(ip+".....connected"); //获取客户端发送过来的数据,那么要使用客户端对象的读取流来读取数据。
InputStream in = s.getInputStream(); byte[] buf = new byte[1024];
int len = in.read(buf); System.out.println(new String(buf,0,len)); s.close();//关闭客户端.
}
//ss.close();
}
}
/*
演示tcp传输。 1,tcp分客户端和服务端。
2,客户端对应的对象是Socket。
服务端对应的对象是ServerSocket。 */ /*
客户端,
通过查阅socket对象,发现在该对象建立时,就可以去连接指定主机。
因为tcp是面向连接的。所以在建立socket服务时,
就要有服务端存在,并连接成功。形成通路后,在该通道进行数据的传输。 需求:给服务端发送给一个文本数据。 步骤:
1,创建Socket服务。并指定要连接的主机和端口。 */
import java.io.*;
import java.net.*;
class TcpClient
{
public static void main(String[] args) throws Exception
{
//创建客户端的socket服务。指定目的主机和端口
Socket s = new Socket("192.168.1.254",10003); //为了发送数据,应该获取socket流中的输出流。
OutputStream out = s.getOutputStream(); out.write("tcp ge men lai le ".getBytes()); s.close();
}
} /*
需求:定义端点接收数据并打印在控制台上。 服务端:
1,建立服务端的socket服务。ServerSocket();
并监听一个端口。
2,获取连接过来的客户端对象。
通过ServerSokcet的 accept方法。没有连接就会等,所以这个方法阻塞式的。
3,客户端如果发过来数据,那么服务端要使用对应的客户端对象,并获取到该客户端对象的读取流来读取发过来的数据。
并打印在控制台。 4,关闭服务端。(可选) */
class TcpServer
{
public static void main(String[] args) throws Exception
{
//建立服务端socket服务。并监听一个端口。
ServerSocket ss = new ServerSocket(10003); //通过accept方法获取连接过来的客户端对象。
while(true)
{
Socket s = ss.accept(); String ip = s.getInetAddress().getHostAddress();
System.out.println(ip+".....connected"); //获取客户端发送过来的数据,那么要使用客户端对象的读取流来读取数据。
InputStream in = s.getInputStream(); byte[] buf = new byte[1024];
int len = in.read(buf); System.out.println(new String(buf,0,len)); s.close();//关闭客户端.
}
//ss.close();
}
}
/*

需求:建立一个文本转换服务器。
客户端给服务端发送文本,服务单会将文本转成大写在返回给客户端。
而且客户度可以不断的进行文本转换。当客户端输入over时,转换结束。 分析:
客户端:
既然是操作设备上的数据,那么就可以使用io技术,并按照io的操作规律来思考。
源:键盘录入。
目的:网络设备,网络输出流。
而且操作的是文本数据。可以选择字符流。 步骤
1,建立服务。
2,获取键盘录入。
3,将数据发给服务端。
4,后去服务端返回的大写数据。
5,结束,关资源。 都是文本数据,可以使用字符流进行操作,同时提高效率,加入缓冲。 */
import java.io.*;
import java.net.*; class TransClient
{
public static void main(String[] args) throws Exception
{
Socket s = new Socket("192.168.1.254",10005); //定义读取键盘数据的流对象。
BufferedReader bufr =
new BufferedReader(new InputStreamReader(System.in)); //定义目的,将数据写入到socket输出流。发给服务端。
//BufferedWriter bufOut =
//new BufferedWriter(new OutputStreamWriter(s.getOutputStream()));
PrintWriter out = new PrintWriter(s.getOutputStream(),true); //定义一个socket读取流,读取服务端返回的大写信息。
BufferedReader bufIn =
new BufferedReader(new InputStreamReader(s.getInputStream())); String line = null; while((line=bufr.readLine())!=null)
{
if("over".equals(line))
break; out.println(line);
// bufOut.write(line);
// bufOut.newLine();
// bufOut.flush(); String str =bufIn.readLine();
System.out.println("server:"+str); } bufr.close();
s.close(); }
}
/* 服务端:
源:socket读取流。
目的:socket输出流。
都是文本,装饰。 */ class TransServer
{
public static void main(String[] args) throws Exception
{
ServerSocket ss = new ServerSocket(10005); Socket s = ss.accept();
String ip = s.getInetAddress().getHostAddress();
System.out.println(ip+"....connected"); //读取socket读取流中的数据。
BufferedReader bufIn =
new BufferedReader(new InputStreamReader(s.getInputStream())); //目的。socket输出流。将大写数据写入到socket输出流,并发送给客户端。
//BufferedWriter bufOut =
//new BufferedWriter(new OutputStreamWriter(s.getOutputStream())); PrintWriter out = new PrintWriter(s.getOutputStream(),true); String line = null;
while((line=bufIn.readLine())!=null)
{ System.out.println(line); out.println(line.toUpperCase());
// bufOut.write(line.toUpperCase());
// bufOut.newLine();
// bufOut.flush();
} s.close();
ss.close(); }
}
/*
该例子出现的问题。
现象:客户端和服务端都在莫名的等待。
为什么呢?
因为客户端和服务端都有阻塞式方法。这些方法么没有读到结束标记。那么就一直等
而导致两端,都在等待。 */
import java.io.*;
import java.net.*; class TextClient
{
public static void main(String[] args) throws Exception
{
Socket s = new Socket("192.168.1.254",10006); BufferedReader bufr =
new BufferedReader(new FileReader("IPDemo.java")); PrintWriter out = new PrintWriter(s.getOutputStream(),true); String line = null;
while((line=bufr.readLine())!=null)
{
out.println(line);
} s.shutdownOutput();//关闭客户端的输出流。相当于给流中加入一个结束标记-1. BufferedReader bufIn = new BufferedReader(new InputStreamReader(s.getInputStream())); String str = bufIn.readLine();
System.out.println(str); bufr.close(); s.close();
}
}
class TextServer
{
public static void main(String[] args) throws Exception
{
ServerSocket ss = new ServerSocket(10006); Socket s = ss.accept();
String ip = s.getInetAddress().getHostAddress();
System.out.println(ip+"....connected"); BufferedReader bufIn = new BufferedReader(new InputStreamReader(s.getInputStream())); PrintWriter out = new PrintWriter(new FileWriter("server.txt"),true); String line = null; while((line=bufIn.readLine())!=null)
{
//if("over".equals(line))
//break;
out.println(line);
} PrintWriter pw = new PrintWriter(s.getOutputStream(),true);
pw.println("上传成功"); out.close();
s.close();
ss.close(); }
}


Java面向对象 网络编程 上的更多相关文章

  1. Java面向对象 网络编程 下

    Java面向对象 网络编程  下 知识概要:                   (1)Tcp 练习 (2)客户端向服务端上传一个图片. (3) 请求登陆 (4)url 需求:上传图片. 客户端:   ...

  2. 第78节:Java中的网络编程(上)

    第78节:Java中的网络编程(上) 前言 网络编程涉及ip,端口,协议,tcp和udp的了解,和对socket通信的网络细节. 网络编程 OSI开放系统互连 网络编程指IO加网络 TCP/IP模型: ...

  3. JAVA的网络编程

    网络编程 网络编程对于很多的初学者来说,都是很向往的一种编程技能,但是很多的初学者却因为很长一段时间无法进入网络编程的大门而放弃了对于该部分技术的学习. 在 学习网络编程以前,很多初学者可能觉得网络编 ...

  4. Java Socket 网络编程心跳设计概念

    Java Socket 网络编程心跳设计概念   1.一般是用来判断对方(设备,进程或其它网元)是否正常动行,一 般采用定时发送简单的通讯包,如果在指定时间段内未收到对方响应,则判断对方已经当掉.用于 ...

  5. 【转】JAVA之网络编程

    转自:火之光 网络编程 网络编程对于很多的初学者来说,都是很向往的一种编程技能,但是很多的初学者却因为很长一段时间无法进入网络编程的大门而放弃了对于该部分技术的学习. 在 学习网络编程以前,很多初学者 ...

  6. JAVA的网络编程【转】

    JAVA的网络编程[转] Posted on 2009-12-03 18:04 火之光 阅读(93441) 评论(20) 编辑 收藏 网络编程 网络编程对于很多的初学者来说,都是很向往的一种编程技能, ...

  7. Java基础——网络编程(二)

    一.套接字 Socket 网络驱动程序提供给应用程序编程的接口和一种机制,可以比喻成一个港口码头 应用程序只要把货放在这,就算完成了货物的运送.它在应用程序中创建,通过一种绑定机制与驱动程序建立关系, ...

  8. java基础-网络编程(Socket)技术选型入门之NIO技术

    java基础-网络编程(Socket)技术选型入门之NIO技术 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.传统的网络编程 1>.编写socket通信的MyServer ...

  9. Java复习——网络编程

    Java从最开始就是支持网络编程的,也正是网络使Java得到发展繁荣.在这里我记录一下如何使用Java进行网络编程,什么是Socket以及Java实现TCP,UDP的编程模型. InetAddress ...

随机推荐

  1. .net core的在初始化数据的拦截处理

    本人初接触 .net core 如有不对的地方,请大家随时指正,共同学习. 首先说明,此案例是基于.net core1.0版本的,对于2.0好多的功能已经升级,例如:一些常用的dll已经在框架中存在, ...

  2. 怎么调用api接口

    api的简单调用,调用api的方法 方法一:用前端方法调用api 完整代码: <!DOCTYPE html> <html lang="en"> <he ...

  3. §--------算法分界线--------§

    如题 As said in the title~ 计算机的cpu计算从根源上由最基本的逻辑电路(晶体管)组成,由此衍生出最基本的数值运算:四则运算.而此后所有的高级算法都是建立在这个基本计算原理(逻辑 ...

  4. 九度OJ 1006 ZOJ

    #include <iostream> #include <string> using namespace std; int getO(string str,int & ...

  5. C语言程序设计课程设计自查表格

    课程设计自查表格 序号 项目 完成与否(完成打勾) 1 格式是否符合标准(缩进是否规范) 2 是否模块化设计(使用函数分解系统功能) 3 函数名否易懂(不得使用f1(int a1,int a2)这样的 ...

  6. java简单数据类型转化

    java简单数据类型,有低级到高级为:(byte,short,char)→int→long→float→double (boolean不参与运算转化) 转化可以分为 低级到高级的自动转化 高级到低级的 ...

  7. 201521123032 《Java程序设计》第7周学习总结

    1. 本周学习总结 以你喜欢的方式(思维导图或其他)归纳总结集合相关内容. 2. 书面作业 ArrayList代码分析 1.1 解释ArrayList的contains源代码 在contains方法中 ...

  8. 201521123062《Java程序设计》第1周学习总结

    1.本章学习总结 认识Java平台运行环境,运行软件 初步认识JDK,JRE,JVM基本含义 书面作业 1.为什么java程序可以跨平台运行?执行java程序的步骤是什么? Java平台运行在各平台的 ...

  9. 201521123088《Java程序设计》第13周学习总结

    1.本周学习总结 2.书面作业 1. 网络基础1.1 比较ping www.baidu.com与ping cec.jmu.edu.cn,分析返回结果有何不同?为什么会有这样的不同? ping cec. ...

  10. JAVA课程设计--简易计算器(201521123022 黄俊麟)

    1.团队课程设计博客链接 http://www.cnblogs.com/I-love-java/p/7058752.html 2.个人负责模板或任务说明 1.初始化业务逻辑. 2.开方.正负.清零.退 ...