您的位置:首页 > 理论基础 > 计算机网络

黑马程序员-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();
}

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  网络编程