黑马程序员-java基础-网络基础知识,JAVA网络编程
2015-07-01 23:37
801 查看
----<a href="http://www.itheima.com" target="blank">Java培训、Android培训、iOS培训、.Net培训</a>、期待与您交流!----
网络基础知识 和 JAVA网络编程:
网络与分布式集群系统的区别:每个节点都是一台计算机,而不是各种计算机内部的功能设备。
Ip:具有全球唯一性,相对于internet,IP为逻辑地址。
端口(port):一台PC中可以有65536个端口,进程通过端口交换数据。连线的时候需要输入IP也需要输入端口信息。
计算机通信实际上的主机之间的进程通信,进程的通信就需要在端口进行联系。
192.168.0.23:21
协议:为了进行网络中的数据交换(通信)而建立的规则、标准或约定。
不同层的协议是不同的。
网络层:寻址、路由(指如何到达地址的过程)
传输层:端口连接
TCP模型:应用层/传输层/网络层/网络接口
端口是一种抽象的软件结构,与协议相关:TCP23端口和UDT23端口为两个不同的概念。
端口应该用1024以上的端口,以下的端口都已经设定功能。
套接字(socket)的引入:
Ip+Port=Socket(这是个对象的概念。)
Socket为传输层概念,而JSP是对应用层编程。例:
java.net.*;
(Server端定义顺序)
ServerSocket(intport)
Socket.accept();//阻塞方法,当客户端发出请求是就恢复
如果客户端收到请求: 则Socket SI=ss.accept();
注意客户端和服务器的Socket为两个不同的socket。
Socket的两个方法:
getInputStream():客户端用
getOutputStream() 服务器端用
使用完毕后切记Socket.close(),两个Socket都关,而且不用关内部的流。
在client端,Socket s=new Socket(“127.0.0.1”,8000);
127.0.0.1为一个默认本机的地址。
案例:
package cn.itcast.tcp05;
/*
* 图片上传客户端
* 读取图片发送服务器-- 字节流
* 读取服务器回来的 上传成功
*/
import java.io.*;
import java.net.*;
public class TCPClient {
public static void main(String[] args) throws Exception{
//创建Socket服务,8000
Socket s = new Socket("192.168.34.59",8000);
//创建字节输入流,读取图片
FileInputStream fis = new FileInputStream("c:\\k.jpg");
//获取字节输出流,将图片写到服务器
OutputStream out = s.getOutputStream();
//定义字节数组缓冲
byte[] bytes = new byte[1024];
int len = 0 ;
while((len = fis.read(bytes))!=-1){
out.write(bytes, 0, len);
}
s.shutdownOutput();
//读取服务器上传成功
BufferedReader bfrIn =
new BufferedReader(new InputStreamReader(s.getInputStream()));
String line = bfrIn.readLine();
System.out.println(line);
fis.close();
s.close();
}
}
package cn.itcast.tcp05;
/*
* 读取客户端图片,写在指定目录上,修改文件名
* 上传成功写回客户端
*/
import java.io.*;
import java.net.*;
import java.util.*;
public class TCPServer {
public static void main(String[] args) throws Exception{
//创建服务器连接对象,监听8000
ServerSocket ss = new ServerSocket(8000);
//获取客户端连接对象
Socket s = ss.accept();
//创建File对象,包装目录
File dir = new File("d:\\upload");
if(!dir.exists())
dir.mkdirs();
//自定义文件名
String fileName = "itcast"+System.currentTimeMillis()+new Random().nextInt(999999999)+".jpg";
//获取字节输入流.读取客户端的图片
InputStream in = s.getInputStream();
//创建字节输出流,目录中写入图片
FileOutputStream fos = new FileOutputStream(dir+File.separator+fileName);
//字节数组缓冲
byte[] bytes = new byte[1024];
int len = 0 ;
while((len = in.read(bytes))!=-1){
fos.write(bytes, 0, len);
}
//获取字节输出流,向客户端,写上传成功
new PrintWriter(s.getOutputStream(),true).println("上传成功");
fos.close();
s.close();
ss.close();
}
}
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
package cn.itcast.chat;
/*
* UDP发送端,键盘录入一行,发一行
* 键盘输入: System.in+InputStreamReader+BufferedReader
*
* 只要是192.168.34在网络IP范围内
* 192.168.34.255(广播地址)
*/
import java.io.*;
import java.net.*;
public class UDPSend {
public static void main(String[] args) throws Exception{
//创建数据包发送对象
DatagramSocket ds = new DatagramSocket();
//IO流读取键盘输入
BufferedReader bfr = new BufferedReader(new InputStreamReader(System.in));
String line = null;
while((line = bfr.readLine())!=null){
if("886".equals(line))
break;
byte[] bytes = line.getBytes();
//创建数据包对象,封装字节数组,长度,IP对象,端口号
DatagramPacket dp = new
DatagramPacket(bytes, bytes.length,InetAddress.getByName("192.168.34.255"),8000);
//调用send方法
ds.send(dp);
}
//关闭资源
ds.close();
}
}
package cn.itcast.chat;
/*
* UDP接收端,不允许结束
*/
import java.net.*;
public class UDPReceive {
public static void main(String[] args)throws Exception {
//创建接收对象DatagramSocket,开启端口
DatagramSocket ds = new DatagramSocket(8000);
//字节数组
byte[] bytes = new byte[1024*64];
while(true){
//创建数据包对象
DatagramPacket dp = new DatagramPacket(bytes, bytes.length);
//调用接收端的receive方法
ds.receive(dp);
//get方法解包
//获取接收到的有效字节数
int length = dp.getLength();
//获取发送端端口号
int port = dp.getPort();
//获取发送的IP地址对象
String ip = dp.getAddress().getHostAddress();
System.out.println(new String(bytes,0,length)+" "+port+" "+ip);
}
}
}
------------------------------------------------------------------------------------------------------------------------------------------------------------
package cn.itcast.chatthread;
import java.net.*;
import java.io.*;
/*
* 实现UDP的聊天程序
* 保证单一窗口的接收和发送
* 多线程技术实现,
* 主线程main,启动程序,开启两个线程,一个线程
* 运行接收端,一个线程运行发送端
* 运行的代码,封装到run方法中即可,DatagramSocket不能放在run
* DatagramSocket对象,在main创建完毕,传递给线程执行
*/
//定义类,实现Runnable接口,UDP的发送端
class UDPSend implements Runnable {
private DatagramSocket ds;
UDPSend(DatagramSocket ds) {
this.ds = ds;
}
public void run() {
try {
// IO流读取键盘输入
BufferedReader bfr = new BufferedReader(new InputStreamReader(
System.in));
String line = null;
while ((line = bfr.readLine()) != null) {
if ("886".equals(line))
break;
byte[] bytes = line.getBytes();
// 创建数据包对象,封装字节数组,长度,IP对象,端口号
DatagramPacket dp = new DatagramPacket(bytes, bytes.length,
InetAddress.getByName("192.168.34.255"), 8000);
// 调用send方法
ds.send(dp);
}
// 关闭资源
ds.close();
} catch (Exception ex) {
}
}
}
// 定义类,实现Runnable接口,实现UDP接收端
class UDPReceive implements Runnable {
private DatagramSocket ds;
UDPReceive(DatagramSocket ds) {
this.ds = ds;
}
public void run() {
try{
// 字节数组
byte[] bytes = new byte[1024 * 64];
while (true) {
// 创建数据包对象
DatagramPacket dp = new DatagramPacket(bytes, bytes.length);
// 调用接收端的receive方法
ds.receive(dp);
// get方法解包
// 获取接收到的有效字节数
int length = dp.getLength();
// 获取发送端端口号
int port = dp.getPort();
// 获取发送的IP地址对象
String ip = dp.getAddress().getHostAddress();
System.out.println(new String(bytes, 0, length) + " " + port + " "
+ ip);
}
}catch(Exception ex){
}
}
}
public class ChatDemo {
public static void main(String[] args)throws Exception {
//创建2个DatagramSocket对象
DatagramSocket send = new DatagramSocket();
DatagramSocket receive = new DatagramSocket(8000);
new Thread(new UDPSend(send)).start();
new Thread(new UDPReceive(receive)).start();
}
}
网络基础知识 和 JAVA网络编程:
网络与分布式集群系统的区别:每个节点都是一台计算机,而不是各种计算机内部的功能设备。
Ip:具有全球唯一性,相对于internet,IP为逻辑地址。
端口(port):一台PC中可以有65536个端口,进程通过端口交换数据。连线的时候需要输入IP也需要输入端口信息。
计算机通信实际上的主机之间的进程通信,进程的通信就需要在端口进行联系。
192.168.0.23:21
协议:为了进行网络中的数据交换(通信)而建立的规则、标准或约定。
不同层的协议是不同的。
网络层:寻址、路由(指如何到达地址的过程)
传输层:端口连接
TCP模型:应用层/传输层/网络层/网络接口
端口是一种抽象的软件结构,与协议相关:TCP23端口和UDT23端口为两个不同的概念。
端口应该用1024以上的端口,以下的端口都已经设定功能。
套接字(socket)的引入:
Ip+Port=Socket(这是个对象的概念。)
Socket为传输层概念,而JSP是对应用层编程。例:
java.net.*;
(Server端定义顺序)
ServerSocket(intport)
Socket.accept();//阻塞方法,当客户端发出请求是就恢复
如果客户端收到请求: 则Socket SI=ss.accept();
注意客户端和服务器的Socket为两个不同的socket。
Socket的两个方法:
getInputStream():客户端用
getOutputStream() 服务器端用
使用完毕后切记Socket.close(),两个Socket都关,而且不用关内部的流。
在client端,Socket s=new Socket(“127.0.0.1”,8000);
127.0.0.1为一个默认本机的地址。
案例:
package cn.itcast.tcp05;
/*
* 图片上传客户端
* 读取图片发送服务器-- 字节流
* 读取服务器回来的 上传成功
*/
import java.io.*;
import java.net.*;
public class TCPClient {
public static void main(String[] args) throws Exception{
//创建Socket服务,8000
Socket s = new Socket("192.168.34.59",8000);
//创建字节输入流,读取图片
FileInputStream fis = new FileInputStream("c:\\k.jpg");
//获取字节输出流,将图片写到服务器
OutputStream out = s.getOutputStream();
//定义字节数组缓冲
byte[] bytes = new byte[1024];
int len = 0 ;
while((len = fis.read(bytes))!=-1){
out.write(bytes, 0, len);
}
s.shutdownOutput();
//读取服务器上传成功
BufferedReader bfrIn =
new BufferedReader(new InputStreamReader(s.getInputStream()));
String line = bfrIn.readLine();
System.out.println(line);
fis.close();
s.close();
}
}
package cn.itcast.tcp05;
/*
* 读取客户端图片,写在指定目录上,修改文件名
* 上传成功写回客户端
*/
import java.io.*;
import java.net.*;
import java.util.*;
public class TCPServer {
public static void main(String[] args) throws Exception{
//创建服务器连接对象,监听8000
ServerSocket ss = new ServerSocket(8000);
//获取客户端连接对象
Socket s = ss.accept();
//创建File对象,包装目录
File dir = new File("d:\\upload");
if(!dir.exists())
dir.mkdirs();
//自定义文件名
String fileName = "itcast"+System.currentTimeMillis()+new Random().nextInt(999999999)+".jpg";
//获取字节输入流.读取客户端的图片
InputStream in = s.getInputStream();
//创建字节输出流,目录中写入图片
FileOutputStream fos = new FileOutputStream(dir+File.separator+fileName);
//字节数组缓冲
byte[] bytes = new byte[1024];
int len = 0 ;
while((len = in.read(bytes))!=-1){
fos.write(bytes, 0, len);
}
//获取字节输出流,向客户端,写上传成功
new PrintWriter(s.getOutputStream(),true).println("上传成功");
fos.close();
s.close();
ss.close();
}
}
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
package cn.itcast.chat;
/*
* UDP发送端,键盘录入一行,发一行
* 键盘输入: System.in+InputStreamReader+BufferedReader
*
* 只要是192.168.34在网络IP范围内
* 192.168.34.255(广播地址)
*/
import java.io.*;
import java.net.*;
public class UDPSend {
public static void main(String[] args) throws Exception{
//创建数据包发送对象
DatagramSocket ds = new DatagramSocket();
//IO流读取键盘输入
BufferedReader bfr = new BufferedReader(new InputStreamReader(System.in));
String line = null;
while((line = bfr.readLine())!=null){
if("886".equals(line))
break;
byte[] bytes = line.getBytes();
//创建数据包对象,封装字节数组,长度,IP对象,端口号
DatagramPacket dp = new
DatagramPacket(bytes, bytes.length,InetAddress.getByName("192.168.34.255"),8000);
//调用send方法
ds.send(dp);
}
//关闭资源
ds.close();
}
}
package cn.itcast.chat;
/*
* UDP接收端,不允许结束
*/
import java.net.*;
public class UDPReceive {
public static void main(String[] args)throws Exception {
//创建接收对象DatagramSocket,开启端口
DatagramSocket ds = new DatagramSocket(8000);
//字节数组
byte[] bytes = new byte[1024*64];
while(true){
//创建数据包对象
DatagramPacket dp = new DatagramPacket(bytes, bytes.length);
//调用接收端的receive方法
ds.receive(dp);
//get方法解包
//获取接收到的有效字节数
int length = dp.getLength();
//获取发送端端口号
int port = dp.getPort();
//获取发送的IP地址对象
String ip = dp.getAddress().getHostAddress();
System.out.println(new String(bytes,0,length)+" "+port+" "+ip);
}
}
}
------------------------------------------------------------------------------------------------------------------------------------------------------------
package cn.itcast.chatthread;
import java.net.*;
import java.io.*;
/*
* 实现UDP的聊天程序
* 保证单一窗口的接收和发送
* 多线程技术实现,
* 主线程main,启动程序,开启两个线程,一个线程
* 运行接收端,一个线程运行发送端
* 运行的代码,封装到run方法中即可,DatagramSocket不能放在run
* DatagramSocket对象,在main创建完毕,传递给线程执行
*/
//定义类,实现Runnable接口,UDP的发送端
class UDPSend implements Runnable {
private DatagramSocket ds;
UDPSend(DatagramSocket ds) {
this.ds = ds;
}
public void run() {
try {
// IO流读取键盘输入
BufferedReader bfr = new BufferedReader(new InputStreamReader(
System.in));
String line = null;
while ((line = bfr.readLine()) != null) {
if ("886".equals(line))
break;
byte[] bytes = line.getBytes();
// 创建数据包对象,封装字节数组,长度,IP对象,端口号
DatagramPacket dp = new DatagramPacket(bytes, bytes.length,
InetAddress.getByName("192.168.34.255"), 8000);
// 调用send方法
ds.send(dp);
}
// 关闭资源
ds.close();
} catch (Exception ex) {
}
}
}
// 定义类,实现Runnable接口,实现UDP接收端
class UDPReceive implements Runnable {
private DatagramSocket ds;
UDPReceive(DatagramSocket ds) {
this.ds = ds;
}
public void run() {
try{
// 字节数组
byte[] bytes = new byte[1024 * 64];
while (true) {
// 创建数据包对象
DatagramPacket dp = new DatagramPacket(bytes, bytes.length);
// 调用接收端的receive方法
ds.receive(dp);
// get方法解包
// 获取接收到的有效字节数
int length = dp.getLength();
// 获取发送端端口号
int port = dp.getPort();
// 获取发送的IP地址对象
String ip = dp.getAddress().getHostAddress();
System.out.println(new String(bytes, 0, length) + " " + port + " "
+ ip);
}
}catch(Exception ex){
}
}
}
public class ChatDemo {
public static void main(String[] args)throws Exception {
//创建2个DatagramSocket对象
DatagramSocket send = new DatagramSocket();
DatagramSocket receive = new DatagramSocket(8000);
new Thread(new UDPSend(send)).start();
new Thread(new UDPReceive(receive)).start();
}
}
相关文章推荐
- Lua下基本的网络编程示例
- linux网络编程用到的网络函数详解用和使用示例
- C#网络编程基础之进程和线程详解
- C++ 网络编程 总结
- Linux网络编程之UDP Socket程序示例
- Android网络编程之UDP通信模型实例
- 谈谈新手如何学习PHP网络编程第1/2页
- Python 网络编程起步(Socket发送消息)
- c# socket网络编程接收发送数据示例代码
- NodeJS学习笔记之网络编程
- Java网络编程之简单的服务端客户端应用实例
- java网络编程之识别示例 获取主机网络接口列表
- Python 网络编程说明第1/2页
- python网络编程学习笔记(一)
- python socket网络编程步骤详解(socket套接字使用)
- python网络编程之TCP通信实例和socketserver框架使用例子
- Android网络编程之获取网络上的Json数据实例
- Java网络编程基础教程之Socket入门实例
- python网络编程之UDP通信实例(含服务器端、客户端、UDP广播例子)
- IOCP浅析[二]——IOCP出现的意义和函数接口