---------------------- android培训、java培训、期待与您交流! ----------------------
网络编程:
网络通讯要素:
IP地址(InetAddress对象),端口号,传输协议(常用的是TCP、UDP)。
UDP:(聊天、网络视频会议……就是采用UDP,数据不重要只求速度快)
将数据及源和目的封装成数据包中,不需要建立连接
每个数据报的大小在限制在64K内
因是无连接的,所以是不可靠协议
不需要连接,速度快
TCP:
建立连接,形成传输数据的通道
在连接中进行大数据量传输
通过三次握手完成连接,是可靠协议
必须建立连接,效率会稍低
Socket:
它是为网络服务提供的一种机制,
网络的两端都要有Socket
网络通信其实就是Socket间的通信
数据在两个Socket间通过IO传输
UDP:
创建发送UDP的流程:
1、建立UDPSocket服务通过DatagramSocket对象
2、提供数据,并将数据封装到数据包中
(DatagramPacket(byte[] buf,int length,InetAddress address,int port))
3、通过Socket服务的发送功能,将数据发送出去通过send()方法
4、关闭资源。close()方法
创建接收UDP的流程:
1、定义UDPSocket服务通过DatagramSocket对象
通常会监听一个端口。其实就是给这个接收网络应用程序定义数据标识。
2、定义一个数据包(DatagramPacket(byte[] buf,int length))
3、通过socket服务的receive()方法将收到的数据存入已定义好的数据包中
4、通过数据包对象的特有功能,将这些不同的数据取出。打印在控制台上
5、关闭资源
Socket与线程结合就能完成聊天小程序。
TCP:
TCP传输采用Socket(客户端对象)和ServerSocket(服务端对象)
Socket端:
1、创建客户端的Socket服务,指定目的主机的端口
Socket socket=new Socket("172.18.70.136",8888);
2、为了发送数据,应该获取socket流中的输出流
OutputStream out=socket.getOutputStream();
ServerSocket端:
1、创建服务器端的Socket服务,并监听一个端口。ServerSocket();
2、获取连接过来的客户端对象,通过ServerSocket的accept方法,没有连接就会等,这个方法是阻塞式的。
3、客户端如果发过来数据,服务端要使用对应的客户端对象 ,并获取到该客户端对象的读取流来该读取发过来的数据,并打印在控制台。
4、关闭服务端(可选)
该例子出现的问题解析:
public class TransClient {
public static void main(String[] args) throws UnknownHostException, IOException {
Socket socket=new Socket("172.18.70.136",10000);
//键盘输入数据信息
BufferedReader keyIn=
new BufferedReader(new InputStreamReader(System.in));
//发向服务器端的输出流
BufferedWriter out=new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));
//接收从服务器端过来的输入流
BufferedReader in=new BufferedReader(new InputStreamReader(socket.getInputStream()));
/**
* 这里可以将bufferedReader替换成PrintWriter可以省去了newLine()和flush();
* PrintWriter in=new PrintWriter(new InputStreamWriter(socket.getInputStream()));
*/
String line=null;
while((line=keyIn.readLine())!=null){
if("886".equals(line)){
break;
}
out.write(line);
//不能少了回车和刷新
out.newLine();
out.flush();
String message=in.readLine();
System.out.println("服务器说:"+message);
}
keyIn.close();
socket.close();
}
}
public class TransServer {
public static void main(String[] args) throws IOException {
ServerSocket serverSocket=new ServerSocket(10000);
Socket socket=serverSocket.accept();
String ip=socket.getInetAddress().getHostAddress();
System.out.println(ip);
//从客户端接收过来的输入流
BufferedReader in=new BufferedReader(new InputStreamReader(socket.getInputStream()));
//发向客户端的输出流
BufferedWriter out=new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));
String line=null;
while((line=in.readLine())!=null){
out.write(line.toUpperCase());
out.newLine();
out.flush();
//String message=in.readLine();
}
socket.close();
serverSocket.close();
}
}
1、因为客户端和服务端都有阻塞式方法,方法没有读到结束标记就一直等
2、因为数据接收到后都在缓冲区,所以要刷新才能真正的写出来,必须flush();
只要用到缓冲区就要记得刷新。bufferWriter.flush();
上传图片例子:
public class Client {
public static void main(String[] args) throws UnknownHostException, IOException {
Socket s=new Socket("172.18.70.136",10003);
OutputStream os=s.getOutputStream();
FileInputStream fis=new FileInputStream("20111026214905.png");
int len=0;
byte[] data=new byte[1024];
while((len=fis.read(data))!=-1){
os.write(data, 0, len);
}
s.shutdownOutput();
InputStream is=s.getInputStream();
byte[] num=new byte[1024];
int lens=is.read(num);
System.out.println(new String(num,0,lens));
fis.close();
s.close();
}
}
public class Server {
public static void main(String[] args) throws IOException {
ServerSocket ss=new ServerSocket(10003);
Socket s=ss.accept();
InputStream is=s.getInputStream();
FileOutputStream fos=new FileOutputStream("1.png");
byte[] data=new byte[1024];
int len=0;
while((len=is.read(data))!=-1){
fos.write(data, 0, len);
}
OutputStream os=s.getOutputStream();
os.write("上传成功!".getBytes());
fos.close();
s.close();
ss.close();
}
}
---------------------- android培训、java培训、期待与您交流! ----------------------
分享到:
相关推荐
day01_Object类、常用API day02_Collection、泛型 day03_List、Set、数据结构、Collections day04_Map,斗地主案例 day05_异常,线程 day06_线程、同步 day07_等待与唤醒案例、线程池、Lambda...Java基础小节练习题答案
黑马程序员Java函数式编程全套视频教程,Lambda表达式、Stream流、函数式编程一套全通关1
Java基础入门,从简到难,视频详细讲解,学编程无压力。
请不要在下载了,链接已经失效, ...java 全套视频教程之JavaSE初级,后续视频会持续更新,特别适用于零基础的未入门者,从基础讲起,到项目实战,实时和机构培训同步(压缩包如需解压密码为java)
含面向对象,异常处理和常用类,线程技术,集合框架,IO操作,网络编程,文件操作,反射机制,
黑马程序员_Java基础辅导班教程课件[第01期]第5天
《Java基础入门》课后习题及答案
黑马程序员 - Java基础教学 - 08 - 面向对象(4)-多态.doc
Java是SUN(Stanford University Network,斯坦福大学网络公司)1995年推出的一门高级语言。是一种面向Internet的编程语言。 随着Java技术在web方面的不断成熟,已经成为Web应用程序的首选开发语言。是简单易学,完全...
进程:正在进行中的程序。 每一个进程执行都有一个执行顺序,该顺序是一个执行路径,或者叫一个控制单元。 线程:是进程中一个执行单元或执行情景或执行路径负责进程中程序执行的控制单元 。...
精选12种与多线程和并发处理相关的设计模式 264张图表 + 300段Java示例程序 = 轻松学习多线程编程 日本经典多线程入门书,原版长销11年!...对Java编程感兴趣的人 c.对设计模式感兴趣的人 d.对面向对象开发感兴趣的人
英文原版PDF,作者:Barry Burd。非常清晰,适合JAVA零基础的编程入门学习,有一定的英文基础就能看懂,语言亲切易懂。完全是傻瓜式学习法。
对Java编程感兴趣的人 c.对设计模式感兴趣的人 d.对面向对象开发感兴趣的人 【电子版来自互联网,仅供预览及学习交流使用,不可用于商业用途,如有版权问题,请联系删除,支持正版,喜欢的请购买正版书籍: ...
Java weka机器学习英文版资料,利于学习weka Java编程,
黑马程序员_张孝祥_Java多线程与并发库,老师讲的非常仔细,老师很有耐心.欢迎大家下载学习.
《Java编程基础》课后习题答案,包括第三到第八章,很全面哦,我全都调试过的
Java.EE企业级编程开发实例详解.pdf
1.有一定JAVA编程基础,希望快速提升技术水平。 2.有一定项目开发经验,希望从事物联网行业应用开发的程序员。 课程内容: 1.MQTT协议 2.EMQ Dashboard 3.EMQ认证 4.日志与追踪 5.发布订阅ACL 6.WebHook 7.管理监控...
提供《Java基础案例教程》-教学PPT,供开发者和初学者进行学习,Java是一种高级计算机语言,它是由SUN公司(已被Oracle公司收购)于1995年5月推出的一种可以编写跨平台应用软件、完全面向对象的程序设计语言。Java...