网络编程:

一、osi和TCP协议对照:

二、通讯三要素:

三、InetAddress对象简述:

 import java.net.InetAddress;
import java.net.UnknownHostException; public class IpClassDemo
{
public static void main(String[] args) throws UnknownHostException{
demo();
} public static void demo() throws UnknownHostException{
//InetAddress没有构造方法,不能直接创建对象
//获取本机
InetAddress ip=InetAddress.getLocalHost();
//获取其他主机
ip=InetAddress.getByName("k01");
System.out.println(ip.getHostAddress());
System.out.println(ip.getHostName());
} }

InetAddress

socket:套接字,网络编程的基础。发送端和接收端都需要socket。

四、UDP实现:首先Java封装了UDP所使用的socket对象-->DatagramSocket,可以简单的获取并加以使用。

UDP是协议,所以要完成通讯,还需要体现另外两个要素:ip和端口。

ip是在发送端使用,指定接收端的地址,端口是发送端和接收端数据交换的线程号

 import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress; public class UDPSendDemo {
public static void main(String[] args) throws IOException{
System.out.println("发送端启动...");
sendemo();
} public static void sendemo() throws IOException {
/*使用UDP发送数据需要四步,
* 1、建立发送端的socket服务,对于UDP协议来说就是创建DatagramSocket对象
* 2、将数据封包,对于UDP协议来说使用的是DatagramPacket对象。!!!该对象还可以用于拆包数据
* 3、使用socket服务发送:这里需要使用通讯协议的另外两个点-->1、接收端的ip,2、端口
* 注意:传输的信息会被接收端的对应端口接收
* 4、关闭socket服务
*/
DatagramSocket ds=new DatagramSocket(); String context="UDP发送演示";
byte[] buf=context.getBytes(); DatagramPacket dp=new DatagramPacket(buf, buf.length, InetAddress.getByName("192.16.25.16"), 10000); ds.send(dp); ds.close();
}
}

UDP发送端演示

 import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket; public class UDPReceiveDemo { public static void main(String[] args) throws IOException {
System.out.println("接收端启动...");
receivedemo();
} public static void receivedemo() throws IOException {
/*使用UDP接收数据和发送过程类似
* 1、建立发送端的socket服务,!!!需要明确端口号
* 2、创建数据包,准备存储和解析数据
* 3、使用socket的receive()接收数据存入准备好的解析对象中
* 4、使用数据包的解析方法解析数据,即拆包.可以解析出发送端地址,端口,数据内容等信息
* 5、关闭socket服务
*/
DatagramSocket ds=new DatagramSocket(10000); byte[] buf=new byte[1024];
DatagramPacket dp=new DatagramPacket(buf, buf.length); ds.receive(dp); //阻塞式,在接收到信息之前一直阻塞
String ip=dp.getAddress().getHostAddress();
int port=dp.getPort();
String context=new String(dp.getData(),0,dp.getLength());
System.out.println("ip是"+ip+",端口是"+port+",内容是\""+context+"\""); ds.close();
} }

UDP接收端演示

 import java.io.IOException;
import java.net.DatagramSocket; public class UDPTest {
/*这是UDP协议的聊天室,使用UDPSendTest2和UDPReceiveTest2,
* 其实就是添加了多线程
*/
public static void main(String[] args) throws IOException {
DatagramSocket send=new DatagramSocket();
DatagramSocket rece=new DatagramSocket(13419);
UDPSendTest2 usend=new UDPSendTest2(send);
UDPReceiveTest2 urece=new UDPReceiveTest2(rece);
Thread t1=new Thread(usend);
Thread t2=new Thread(urece);
t1.start();
t2.start();
} }

UDP简单聊天室

 import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress; public class UDPSendTest2 implements Runnable{
private DatagramSocket ds;
public UDPSendTest2(DatagramSocket ds){
this.ds=ds;
}
public void run(){
try{
BufferedReader br=new BufferedReader(new InputStreamReader(System.in));
String line=null;
while((line=br.readLine())!=null){
byte[] buf=line.getBytes();
DatagramPacket dp=new DatagramPacket(buf, buf.length, InetAddress.getByName("172.25.14.5"), 13419);
ds.send(dp);
if(line.equals("886")){
break;
}
}
ds.close();
}catch(Exception e){
}
}
}

聊天室发送端

 import java.net.DatagramPacket;
import java.net.DatagramSocket; public class UDPReceiveTest2 implements Runnable{
private DatagramSocket ds;
public UDPReceiveTest2(DatagramSocket ds){
this.ds=ds;
}
public void run(){
try{
while(true){
byte[] buf=new byte[1024];
DatagramPacket dp=new DatagramPacket(buf, buf.length); ds.receive(dp);
String context=new String(dp.getData(),0,dp.getLength());
System.out.println("内容是:"+context);
if(context.equals("886")){
System.out.println("对方退出聊天");
}
}
}catch(Exception e){
}
} }

聊天室接收端

五、TCP实现:TCP协议比UDP复杂,在Java中表现在区分服务器端和客户端不同的socket对象。

服务器端-->ServerSocket

客户端---->Socket

 import java.io.IOException;
import java.io.OutputStream;
import java.net.Socket;
import java.net.UnknownHostException; public class TCPClientDemo { public static void main(String[] args) throws UnknownHostException, IOException {
demo();
} public static void demo() throws UnknownHostException, IOException {
/*TCP传输客户端的建立过程:
* 1、创建客户端socket服务,使用Socket对象
* 建议:一旦创建该对象,就明确要连接的主机地址
* 2、如果连接成功,会生成一个通道。在Java中表现为socket流,
* 有输入流和输出流,对应的对象可以通过Socket对象获取
* getOutputStream() --》获取输出流
* getInputStream() --》获取输入流
* 3、使用输出流发送数据,还可以接受服务器端反馈的数据
* 4、关闭资源
*/
Socket s=new Socket("172.25.14.9", 10002);
OutputStream os=s.getOutputStream();
os.write("TCP演示".getBytes());
s.close();
} }

TCP客户端演示

 import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.ServerSocket;
import java.net.Socket; public class TCPServerDemo { public static void main(String[] args) throws IOException {
/*TCP和UDP的一个不同是:TCP是面向连接的,
* 就是说要先开启服务器端,在开启客户端,两端相连接才能通讯
* 而UDP只要两端开启就可以通讯
*/
demo();
} public static void demo() throws IOException {
/*
* 建立TCP服务器端的过程
* 1、建立服务器端的socket服务,使用ServerSocket对象
* !!! 注意:服务器端必须提供一个端口给客户端使用,否则无法连接
* 2、获取正在连接的客户端socket对象,并使用该对象对应的通道,即socket流进行数据发送
* !!!注意:这是因为 服务器端需要和多个客户端进行数据交换,这样可以保证数据不会传错
* 3、关闭资源,包括客户端和服务器端。
*/
ServerSocket ss=new ServerSocket(10002); //accept()是阻塞式,在服务器端开启后会一直阻塞,直到有传输数据进入才会执行下一步操作
Socket s=ss.accept();
InputStream is=s.getInputStream(); BufferedReader br=new BufferedReader(new InputStreamReader(is));
System.out.println(br.readLine()); s.close();
ss.close();
} }

TCP服务器端演示

 import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.PrintStream;
import java.net.Socket;
import java.net.UnknownHostException; public class TCPClientTest { public static void main(String[] args) throws UnknownHostException, IOException {
//TCPTest是用TCP协议建立一个服务器端,对客户端传来的数据进行大小写转换,使用键盘录入
demo();
} public static void demo() throws UnknownHostException, IOException {
Socket s=new Socket("172.25.14.9", 7999);
OutputStream os=s.getOutputStream();
PrintStream out=new PrintStream(os); BufferedReader br=new BufferedReader(new InputStreamReader(System.in));
BufferedReader brIn=new BufferedReader(new InputStreamReader(s.getInputStream()));
String str=null;
while((str=br.readLine())!=null){
if(str.equals("over")){
break;
}
out.println(str);
//上面一句相当于下面一句
//out.print(str+"\r\n");
//out.flush();
String upperStr=brIn.readLine();
System.out.println(upperStr);
} s.close();
}
}

TCP大小写转换客户端

 import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.PrintStream;
import java.net.ServerSocket;
import java.net.Socket; public class TCPServerTest { public static void main(String[] args) throws IOException {
demo();
} public static void demo() throws IOException {
ServerSocket ss=new ServerSocket(7999); Socket s=ss.accept();
InputStream is=s.getInputStream(); BufferedReader br=new BufferedReader(new InputStreamReader(is));
OutputStream os=s.getOutputStream();
PrintStream out=new PrintStream(os,true);
String str=null;
while((str=br.readLine())!=null){
out.println(str.toUpperCase());
}
s.close();
ss.close();
} }

TCP大小写转换服务器端

 import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.FileReader;
import java.io.PrintStream;
import java.net.Socket;
import java.net.UnknownHostException; public class TCPUploadClient { public static void main(String[] args) throws UnknownHostException, IOException {
demo();
} public static void demo() throws UnknownHostException, IOException {
Socket s=new Socket("172.25.14.4", 7999);
OutputStream os=s.getOutputStream();
PrintStream out=new PrintStream(os); BufferedReader br=new BufferedReader(new FileReader("D:\\2.txt"));
String str=null;
while((str=br.readLine())!=null){
out.println(str);
} //因为TCP两端都有阻塞式方法,为了结束通讯过程,Java的socket对象提供了TCP通讯结束标记,
s.shutdownOutput(); BufferedReader brIn=new BufferedReader(new InputStreamReader(s.getInputStream()));
String context=brIn.readLine();
System.out.println(context);
br.close();
s.close();
}
}

TCP文本文件上传客户端

 import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.Socket;
import java.io.FileWriter;
import java.io.PrintStream; public class TCPUploadServer { public static void main(String[] args) throws IOException {
demo();
} public static void demo() throws IOException {
ServerSocket ss=new ServerSocket(7999); Socket s=ss.accept();
String ip=s.getInetAddress().getHostAddress();
System.out.println(ip+"....connect");
InputStream is=s.getInputStream(); BufferedReader br=new BufferedReader(new InputStreamReader(is));
BufferedWriter bw=new BufferedWriter(new FileWriter("D:\\1.txt"));
OutputStream os=s.getOutputStream();
PrintStream out=new PrintStream(os,true);
String str=null;
while((str=br.readLine())!=null){
if(str.equals("over")){
break;
}
bw.write(str);
bw.newLine();
bw.flush();
}
out.println("get");
bw.close();
s.close();
ss.close();
} }

TCP文本文件上传服务器端

六、服务器和客户端

ip:

Java学习笔记十的更多相关文章

  1. Java学习笔记十五:Java中的成员变量和局部变量

    Java中的成员变量和局部变量 一:成员变量: 成员变量在类中定义,用来描述对象将要有什么 成员变量可以被本类的方法使用,也可以被其他类的方法使用,成员变量的作用域在整个类内部都是可见的 二:局部变量 ...

  2. Java学习笔记十九:Java中的访问控制修饰符

    Java中的访问控制修饰符 一:Java修饰符的种类: 访问修饰符 非访问修饰符 修饰符用来定义类.方法或者变量,通常放在语句的最前端.我们通过下面的例子来说明: public class Hello ...

  3. Java学习笔记十八:Java面向对象的三大特性之封装

    Java面向对象的三大特性之封装 一:面向对象的三大特性: 封装 继承 多态   二:封装的概念: 将类的某些信息隐藏在类内部,不允许外部程序直接访问,而是通过该类提供的方法来实现对隐藏信息的操作和访 ...

  4. Java学习笔记十六:Java中的构造方法

    Java中的构造方法 1.使用new+构造方法 创建一个新的对象: 2.构造方法是定义在Java类中的一个用来初始化对象的方法: 3.构造方法与类同名且没有返回值: 4.语法格式: public 构造 ...

  5. Java学习笔记十四:如何定义Java中的类以及使用对象的属性

    如何定义Java中的类以及使用对象的属性 一:类的重要性: 所有Java程序都以类class为组织单元: 二:什么是类: 类是模子,确定对象将会拥有的特征(属性)和行为(方法): 三:类的组成: 属性 ...

  6. Java学习笔记十二:Java中方法的重载

    Java中方法的重载 什么是方法的重载呢? 如果同一个类中包含了两个或两个以上方法名相同.方法参数的个数.顺序或类型不同的方法,则称为方法的重载,也可称该方法被重载了.如下所示 4 个方法名称都为 s ...

  7. Java学习笔记十:Java的数组以及操作数组

    Java的数组以及操作数组 一:什么是数组: 数组可以理解为是一个巨大的“盒子”,里面可以按顺序存放多个类型相同的数据,比如可以定义 int 型的数组 scores 存储 4 名学生的成绩 数组中的元 ...

  8. Java学习笔记(十)面向对象---接口

    理解 初期理解 可以认为接口是一个特殊的抽象类.当接口中的方法都是抽象的,那么该类可以通过接口的形式来表示. class用于定义类 interface用于定义接口 格式特点 接口中常见定义:常量,抽象 ...

  9. Java学习笔记十二--集合(三)

    第一节课 返回值 方法名 作用 void add(index,elemnet) 在指定的索引处添加元素 object get(index) 返回指定索引处的元素 int indexOf(object) ...

随机推荐

  1. Android 自定义viewpager 三张图片在同一屏幕轮播的效果

    github:https://github.com/nickeyCode/RoundImageViewPager 说实话不知道怎么描述这个效果,在网页上见得跟多,公司要求做这个效果得时候不知道怎么用文 ...

  2. iOS崩溃日志

    今天看crash report ,有这样两个crash: 调用 stopUpdatingLocation 函数的是一个CLLocationManager 类型的对象,为什么报错的时候会把这个对象转成N ...

  3. B-Boxes

    http://agc010.contest.atcoder.jp/tasks/agc010_b Problem Statement There are N boxes arranged in a ci ...

  4. Java导出csv修正时间格式

    处理前导出的日期格式为:yyyy-M-d HH:mm 正确的应该是:yyyy-MM-dd HH:mm:ss 处理方案是在 时间数据两边增加 "\t" 有问题欢迎交流. thanks ...

  5. Redis特点以及安装

       Mysql 的数据 是以"文件形式存储在硬盘"里边.硬盘运行速度相比较CPU.内存是排在第三的.而 Redis 是内存高速缓存数据库,运行速度比 Mysql 速度快,也支持数 ...

  6. mysql每个表总的索引大小

    /* 指定的数据库 每个表的索引 不包含主键索引的大小*/ ,),,),'mb') as index_size from information_schema.tables where TABLE_S ...

  7. Nginx 性能调优

    原文地址:http://nginx.com/blog/tuning-nginx/ Tuning NGINX for Performance Nginx 性能调优 NGINX is well known ...

  8. Linux系统编程——进程间通信:信号中断处理

    什么是信号? 信号是 Linux 进程间通信的最古老的方式.信号是url=474nN303T2Oe2ehYZjkrggeXCaJPDSrmM5Unoh4TTuty4wSgS0nl4-vl43AGMFb ...

  9. HDU 4714 Tree2cycle(树型DP)

    解题思路: 将一棵树变成一个环.假设一个结点的分叉数目大于等于2.则将它与父节点断开.而且断开子结点数目sum - 2条边,并再次连接sum-2个儿子形成一条直链然后这条游离链与还有一条游离链相连,共 ...

  10. swift具体解释之八---------------下标脚本

    swift具体解释之八-----下标脚本 下标脚本 能够定义在类(Class).结构体(structure)和枚举(enumeration)这些目标中.能够觉得是訪问对象.集合或序列的快捷方式.不须要 ...