JAVA 24 网络通信

网络参考模型:

--|| OSI参考模型

--|| TCP/IP参考模型

应用层:http协议,ftp协议

传输层:tcp,udp

网际层:ip

TCP和UDP:

UDP:

1,面向无连接的,需要将数据封装在数据包中

2,每个数据包大小限制在64k内

3,无连接,是不可靠协议

4,因无连接,速度快

TCP:

1,需要建立连接,形成数据传输通道

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

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

甲:已你在吗

已:我在

甲:我知道你在了

4,必须建立连接,效率稍低

重要对象介绍

 

InetAddress

方法介绍:

1,static InetAddress getLocalHost()  //获取本地主机IP

2,static InetAddress getByName(String ip/name)

Socket

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

通信两端都有Socket

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

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

UDP的Socket传输服务对象:

DatagramSocket(port/可选接受端口时)

1,void send(DatagramPacket p)

2,void receive(DatagramPacket p)

DatagramPacket:

构造方法:

DatagramPacket(byte[] buf,int length)

DatagramPacket(byte[] buf,int length,InetAddress ad,int port)

TCP的Soceket服务对象

tcp分客户端和服务端。

案例一

 

tcp结束方式

1,客户端发送结束标记,单如果发送的数据中包含该标记就不好了  //不推荐

2,时间戳方法,先发送一遍时间戳,在发送一遍时间戳,当服务端读取到第二次时间戳时就停止tcp通信     //不推荐

3,shutdownInput() ,shutdowmOutput() //关闭输入输出流,相当于加入结束标记

/*

客户端,

通过查阅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,结束,关资源。

都是文本数据,可以使用

字符流进行操作,同时提高效率,加入缓冲。

服务端:

源:socket读取流。

目的:socket输出流。

都是文本,装饰。

 

 

该例子出现的问题。

现象:客户端和服务端都在莫名的等待。

为什么呢?

因为客户端和服务端都有阻塞式方法。这些方法么没有读到结束标记。那么就一直等

而导致两端,都在等待。

 

 

下例中的客户端和服务端输出流都可以用

PrintWriter out = new PrintWriter(s.getInputStream())代替

 

客户端

import java.io.*;

import java.net.*;

public class Test {

public static void main(String[] args) throws Exception

{

Socket s = new Socket("localhost",9999);

BufferedWriter bufout = new BufferedWriter(new OutputStreamWriter(s.getOutputStream()));

BufferedReader bufin = new BufferedReader(new InputStreamReader(s.getInputStream()));

BufferedReader br= new BufferedReader(new InputStreamReader(System.in));

while(true)

{

String line =br.readLine();

bufout.write(line);

bufout.newLine();

bufout.flush();

if("over".equals(line))

break;

String data =bufin.readLine();

sop("server:"+data);

}

s.close();

}

public static void sop(Object o)

{

System.out.println(o);

}

}

服务端

 

import java.io.*;

import java.net.*;

public class zhangxu {

public static void main(String[] args) throws  Exception

{

ServerSocket s = new ServerSocket(9999);

Socket ss = s.accept();

sop(ss.getInetAddress().getHostAddress());

BufferedWriter bufout = new BufferedWriter(new OutputStreamWriter(ss.getOutputStream()));

BufferedReader bufin = new BufferedReader(new InputStreamReader(ss.getInputStream()));

while(true)

{

String line =bufin.readLine(); //由于客户端没有发送回车键,所以一直没有读完,客户端打印的时候应该带换行

sop(line);

bufout.write(line.toUpperCase());

bufout.newLine();

bufout.flush();

}

}

public static void sop(Object o)

{

System.out.println(o);

}

}

udp通信举例

/*

需求: 通过udp传输方式将一段文字发送出去

1,建立udp socket服务

2,提高数据,将数据风罩到数据包中

3,通过socket服务发送功能发送数据包

4,关闭资源

需求:接收发送过来的数据

1,建立 udp socket服务,通常会定义一个接收端口。

2,建立容纳数据的数据包,存储接收到的字节数据,因为数据包对象有方法可以提取信息。

3,通过receive方法监听并接受数据存储到已定义好的数据包中。

4,通过数据包对象的特有功能,将不同数据取出。

5,关闭资源

*/

发送端

import java.io.IOException;

import java.net.*;

public class Test {

public static void main(String[] args) throws  IOException

{

sop(111);

DatagramSocket ds = new DatagramSocket();

byte [] data ="udp 哈哈".getBytes();

DatagramPacket dp = new DatagramPacket(data,data.length,InetAddress.getLocalHost(),8888);

ds.send(dp);

ds.close();

}

public static void sop(Object o)

{

System.out.println(o);

}

}

接收端

import java.net.*;

public class zhangxu {

public static void main(String[] args) throws  Exception

{

sop("listen...");

DatagramSocket ds= new DatagramSocket(8888);//设置了监听端口

byte [] buf = new byte[1024];

DatagramPacket dp = new DatagramPacket(buf,buf.length);

ds.receive(dp);

String ip =dp.getAddress().getHostAddress();

String data = new String(dp.getData(),0,dp.getLength());

int port = dp.getPort();

sop(ip+"--"+data+"--"+port);

ds.close();

}

public static void sop(Object o)

{

System.out.println(o);

}

}

/*

需求:tcp上传图片。

 

 

 

*/

/*

客户端。

1,服务端点。

2,读取客户端已有的图片数据。

3,通过socket 输出流将数据发给服务端。

4,读取服务端反馈信息。

5,关闭。

 

*/

import java.io.*;

import java.net.*;

public class Test {

public static void main(String[] args) throws Exception

{

Socket s = new Socket("localhost",9999);

FileInputStream fi= new FileInputStream("C:\\Users\\zx\\Desktop\\1.png");

byte [] buf = new byte[1024];

OutputStream out = s.getOutputStream();

InputStream in = s.getInputStream();

int len;

while((len=fi.read(buf))!=-1)

{

out.write(buf, 0, len);

}

s.shutdownOutput(); //注意这里,如果不加入这句,服务端无法得到-1,因为当本地文件达到末尾时,发送完数据就不会再发送了。

len =in.read(buf);

sop(new String(buf,0,len));

s.close();

fi.close();

}

public static void sop(Object o)

{

System.out.println(o);

}

}

import java.io.*;

import java.net.*;

public class zhangxu {

public static void main(String[] args) throws  Exception

{

ServerSocket ss = new ServerSocket(9999);

Socket s = ss.accept();

InputStream in = s.getInputStream();

OutputStream out = s.getOutputStream();

FileOutputStream fi = new FileOutputStream("e:\\888.png");

byte [] buf =new byte [1024];

int len;

while((len=in.read(buf))!=-1)

{

fi.write(buf,0,len);

}

out.write("上传成功".getBytes());

sop("over");

out.close();

ss.close();

s.close();

fi.close();

}

public static void sop(Object o)

{

System.out.println(o);

}

}

需求:多线程tcp上传图片。

 

import java.io.*;

import java.net.*;

public class Test {

public static void main(String[] args) throws Exception

{

while(true)

{

Socket s = new Socket("localhost",8888);

FileInputStream fi= new FileInputStream("C:\\Users\\zx\\Desktop\\1.png");

byte [] buf = new byte[1024];

OutputStream out = s.getOutputStream();

InputStream in = s.getInputStream();

int len;

while((len=fi.read(buf))!=-1)

{

out.write(buf, 0, len);

}

s.shutdownOutput(); //注意这里,如果不加入这句,服务端无法得到-1,因为当本地文件达到末尾时,发送完数据就不会再发送了。

len =in.read(buf);

sop(new String(buf,0,len));

s.close();

fi.close();

Thread.sleep(500);

}

}

public static void sop(Object o)

{

System.out.println(o);

}

}

import java.io.*;

import java.net.*;

public class zhangxu {

public static void main(String[] args) throws  Exception

{

while(true)

{

ServerSocket ss = new ServerSocket(8888);

Socket s = ss.accept();

new Thread(new Update(s)).start();

ss.close();

}

}

public static void sop(Object o)

{

System.out.println(o);

}

}

class Update implements Runnable

{

Socket s;

Update(Socket s)

{

this.s=s;

}

private static int count =0;

public void run()

{

try

{

InputStream in = s.getInputStream();

OutputStream out = s.getOutputStream();

FileOutputStream fi = new FileOutputStream("e:"+count++ +".png");

byte [] buf =new byte [1024];

int len;

while((len=in.read(buf))!=-1)

{

fi.write(buf,0,len);

}

out.write(("上传成功"+count).getBytes());

System.out.println("over"+count);

out.close();

s.close();

fi.close();

}

catch(Exception e)

{

}

}

}

时间: 2024-10-11 07:03:23

JAVA 24 网络通信的相关文章

[原]使用Fiddler捕获java的网络通信数据

[原]使用Fiddler捕获java的网络通信数据 System.setProperty("http.proxySet", "true"); System.setProperty("http.proxyHost", "127.0.0.1"); System.setProperty("http.proxyPort", "8888");

java 24点算法实现

最近闲来无事,突然怀念起小时候和堂兄表姐们经常玩24点游戏,于是就琢磨着是不是开发一个安卓手机版本.然后上网上一搜,发现已经被别人给开发烂了啊.不过这只能说明这个小游戏要想赚广告费很难了,但是拿来锻炼和在妹纸面前装逼还是很有价值的,嘿嘿,想到这里,我最终还是花了3天时间开发了一个小游戏出来. 算法实现 在网上试玩了一个flash的版本,发现还需要实现计算所有正确的结果,然后网上稍微百度了下思路,就开始自己实现了.我开始时大概的思路就是穷举出所有的数字和算式的排列组合,然后一一进行验算,中间碰到两

java 24 - 10 GUI 之 四则预算的数据校验

我想要在校验的过程中,如果输入到操作数中的不是数字,则弹出提醒框: 类 JOptionPane  有助于方便地弹出要求用户提供值或向其发出通知的标准对话框 方法名 描述 showConfirmDialog 询问一个确认问题,如 yes/no/cancel. showInputDialog 提示要求某些输入. showMessageDialog 告知用户某事已发生. showOptionDialog 上述三项的大统一 (Grand Unification). 在设置窗体类添加代码: 1 priva

java 24 - 7 GUI之 创建多级菜单窗体

需求: 创建多级菜单 步骤: A:创建窗体对象(并设置属性和布局) B:创建菜单栏 C:创建菜单和子菜单 D:逐步添加菜单(子菜单添加到菜单中,菜单添加到菜单栏中) E:窗体中设置菜单栏(菜单栏并不是添加,而是设置) F:设置各个菜单对应的监听事件 G:设置窗体关闭监听时间 H:设置显示窗口 代码: 1 public class FrameText4 { 2 3 public static void main(String[] args) { 4 5 // 创建窗体对象 6 final Fram

黑马程序员--Java基础--网络通信

--Java培训.Android培训.iOS培训..Net培训 期待与您共同交流!-- 文章大纲: 1.网络基础 2.TCP通信 3.UDP通信 1. 网络基础 1.1. 网络协议 1.1.1. 网络协议分层 OSI(开放系统互联(Open System Interconnection))模型是国际标准化组织ISO创立的.这是一个理论模型,并无实际产品完全符合OSI模型.制订OSI模型只是为了分析网络通讯方便而引进的一套理论.也为以后制订实用协议或产品打下基础. OSI模型共分七层:从上至下依次

java 24 - 6 GUI之 创建只能输入数字的文本框

需求: 创建一个含有标签和文本框的窗体,其中文本框只能输入数字 步骤:(大致上) 创建窗体对象 创建标签对象 创建文本框对象 把组件添加到窗体中 设置标签的监听事件,对键盘按下的数据进行监听 设置窗体关闭监听事件 设置显示窗体 代码: 1 public class FrameTest3 { 2 3 public static void main(String[] args) { 4 5 // 创建窗体对象 6 Frame f = new Frame("QQ号码"); 7 f.setBo

那些年,一起学的Java 2-4

/**接收用户输入的若干整数,以一个-1标志输入结束, * 求出其中的最大值.最小值和平均值 **/ import java.util.*; public class FirstProgram { public static void main (String args[]) { int x; int max = -2147483648; int min = 2147483647; int n = 0; int sum = 0; Scanner in = new Scanner (System.

java 24小时倒计时案例

import java.util.Calendar; import java.util.Date; public class Daojishi { static String Countdown=""; public static void main(String[] args) { //开启倒计时 time2(); System.out.println("Countdown="+Countdown); } /** * 倒计时,设定时间戳 */ private st

java中网络通信 Scoket

在客户/服务器通信模式中,客户端需要主动建立与服务器连接的Socket,服务器端收到客户端的连接请求,也会创建与客户端连接的Socket.Socket可以看做是通信连接两端的收发器,客户端和服务店都通过Socket来收发数据. 1.构造Socket public Socket() 通过系统默认类型的 SocketImpl 创建未连接套接字 public Socket(String host,int port) throws UnknownHostException,IOException  创建