/*
网络编程UDP,TCP。IP。DatagramSocket。DatagramPacket。聊天程序。TCP传输。文本转换服务器。
*/
//网络编程
//图片。。网络编程逻辑端口
//(127.0.0.1)计算机本地默认地址。
/*
系统保留端口(0-1024)
*/
import java.net.*;
class IPDemo//演示IP地址,对象InetAddress
{
public static void main(String[] args) throws Exception
{
/*
InetAddress i = InetAddress.getLocalHost();//返回本地主机,会抛出异常
System.out.println(i.toString());
System.out.println(i.getHostAddress());//地址
System.out.println(i.getHostName());//名称
*/
//InetAddress ia = InetAddress.getByName("www.baidu.com");可以拿baidu的。
InetAddress ia = InetAddress.getByName("192.168.1.254");//拿任意一台主机的
System.out.println("address:"+ia.getHostAddress());
System.out.println("name:"+ia.getHostName());
}
}
/*
UDP:
将数据及源和目的封装成数据包中,不需要建立连接。
每个数据包的大小限制在64K内
因为无连接,是不可靠协议
不需要建立连接,速度快。
TCP:
建立连接,形成传输数据的通道
在连接中进行大数据传输
通过三次握手完成连接,是可靠协议
必须建立连接,效率会稍低。
Socket:
Socket就是为网络服务提供的一种机制
通信的两端都有Socket。
网络通信其实就是Socket间的通信。
数据在两个Socket间通过IO传输。
Socket:相当于码头,通信要先有Socket.
UDP传输
DatagramSocket与Datagrampacket
建立发送端,接收端。
建立数据包
调用Socket的发送接收方法
关闭Socket.
发送端和接收端是二个独立运行程序.
DatagramSocket:能发能收。
Datagrampacket:数据报包。
*/
import java.net.*;
/*
1,建立udpsocket服务。
2,提供数据,并将数据封装到数据包中。
3,通过socket服务的发送功能,将数据包发出去。
4,关闭资源。
*/
class UdpSend
{
public static void main(String[] args) throws Exception
{
//1创建udp服务,通过DatagramSocket对象
DatagramSocket ds = new DatagramSocket();
//2确定数据,并封装成数据包。
byte[] buf = "udp ge men lai le ".getBytes();
DatagramPacket dp =
new DatagramPacket(buf,buf.length,InetAddress.getByName("127.0.0.1"),10000);
//3,通过socked服务,将已有的数据包发送出去,通过send方法
ds.send(dp);
//4关闭资源
ds.close();
}
}
/*
需要:
定义一个应用程序,用于接收udp协议传输的数据并处理。
思路:
1,定义一个udpCocket服务。通常会监听一个端口,端口就是数字标识。
2,定义一个数据包,因为要存储接收到的字节数据,
因为数据包对象中有更多功能可以提取字节数据中的不同数据信息。
3。通过socket服务的receive方法将收到的数据存入已定义好的数据包中。
4。通过数据包对象的特有功能,将这些不同的数据取出,打印在控制台上。
5。关闭资源。
*/
class UdpRece
{
public static void main(String[] args) throws Exception
{
//1定义一个udpCocket服务。通常会监听一个端口,
DatagramSocket ds = new DatagramSocket(10000);
while(true){//可以一直接收数据,但是Socket服务要建立在外面。
//2定义一个数据包,接收信息
byte[] buf = new byte[1024];
DatagramPacket dp = new DatagramPacket(buf,buf.length);
//3通过socket服务的receive方法
ds.receive(dp);
//4通过数据包对象的特有功能
String ip = dp.getAddress().getHostAddress();
String data = new String(dp.getData(),0,dp.getLength());//这里要记清。
int port = dp.getPort();//获取端口
System.out.println(ip+"::"+data+"::"+port);
//5关闭资源。
//ds.close();//while循环的时候不能再关,一直接收。
}
}
}
/*192.168.1.255广播地址。*/
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.net.SocketException;
//录入键盘输入
public class ChatDemo {
public static void main(String[] args) {
// TODO Auto-generated method stub
}
}
class SendDemo{
public static void main(String[] args) throws IOException {
DatagramSocket ds = new DatagramSocket();
BufferedReader bufr = new BufferedReader(
new InputStreamReader(System.in));
String line = null;
while((line=bufr.readLine())!=null)
{
byte[] buf = line.getBytes();
DatagramPacket dp = new DatagramPacket(
buf,buf.length,InetAddress.getByName("127.0.0.1"),10001);
ds.send(dp);
}
ds.close();
}
}
class ReceiveDemo{
public static void main(String[] args) throws IOException {
DatagramSocket ds = new DatagramSocket(10001);
while(true)
{
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();
System.out.println(ip+"::"+port+"::"+data);
//System.out.println(dp.getAddress());
}
}
}
/*
编写一个聊天程序
有收数据的部分,和发数据的部分
这二部分需要同时执行,那就需要多线程技术
一个线程收,一个线程控制发。
因为收和发动作是不一致的,所以定义二个run方法。
*/
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.net.SocketException;
public class ChatDemo2 {
public static void main(String[] args) throws Exception {
// TODO Auto-generated method stub
DatagramSocket ds = new DatagramSocket();
DatagramSocket dds = new DatagramSocket(10005);
new Thread(new Receive(dds)).start();
new Thread(new Send(dds)).start();
}
}
class Send implements Runnable{
private DatagramSocket ds;
Send(DatagramSocket ds){
this.ds = ds;
}
public void run()
{
BufferedReader bufr = new BufferedReader(new InputStreamReader(
System.in));
String line = null;
try {
while((line = bufr.readLine())!=null){
byte[] buf = line.getBytes();
DatagramPacket dp = new DatagramPacket(
buf,0,buf.length,InetAddress.getByName("127.0.0.1"),10005);
ds.send(dp);
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
class Receive implements Runnable{
private DatagramSocket ds;
Receive(DatagramSocket ds){
this.ds = ds;
}
public void run()
{
while(true)
{
byte[] buf = new byte[1024];
DatagramPacket dp = new DatagramPacket(buf,buf.length);
try {
ds.receive(dp);
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
String ip = dp.getAddress().getHostAddress();
String data = new String(dp.getData(),0,dp.getLength());
System.out.println(ip+":"+data);
}
}
}
/*
TCP传输
Socket和ServerSocket
建立客户端和服务器端
建立连接后,通过Socket中的IO流进行数据的传输。
关闭socket.
同样,客户端和服务端也是二个独立的应用程序。
演示TCP传输。
1.tcp分客户端和服务端。
2。客户端对对应的是Socket.
服务端对应的是ServerSocket.
客户端:
通过查阅Socket对象,发现该对象建立时,就可以去连接指定主机
因为tcp是面向连接的,所以建立socket时。就要有服务端存在,
并连接成功,形成通路后,在该通道进行数据的传输。
*/
import java.io.*;
import java.net.*;
//给服务端发送一个文本数据
class TcpClient //客户端
{
public static void main(String[] args) throws Exception
{
//1.创建Socket服务,并指定要连接的主机和端口。
Socket s = new Socket("127.0.0.1",10003);
//为了发送数据,要获取Socket流中的输出流。
OutputStream out = s.getOutputStream();//拿到输出流
out.write("tcp gao gao gao ".getBytes());
s.close();
}
}
/*1.建立服务端的ServerSocket(),并监听一个端口;
2.获取连接过来的客户端对象。
通过accept()方法,没有连接就会等,阻塞式的。
3.客户端如果发过来数据,那么服务端要使用接收到的客户端对象,
然后通过该对象拿到读取流。来读取发过来的数据。
4.可选.关闭服务端。
*/
class TcpServer
{
public static void main(String[] args)
{
ServerSocket ss = new ServerSocket(10003);
Socket s = ss.accept();//服务端可以拿到客户端的对象
String ip = s.getInetAddress().getHostAddress();//客户端对象有封装IP
//服务端可以拿到客户端的对象,进而拿到客户端的输出输入流
InputStream in = s.getInputStream();
byte[] buf = new byte[1024];
int len = in.read(buf);
String text = new String(buf,0,len);
System.out.println(ip+"..."text);
s.close();//服务端可能不关自己,但要关对方。
ss.close();
}
}
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.Socket;
//TCP的客户端和服务端交互
public class SocketDemo2 {
public static void main(String[] args) throws IOException {
Socket s = new Socket("127.0.0.1",10009);
OutputStream os = s.getOutputStream();
os.write("lei le".getBytes());
InputStream is = s.getInputStream();
byte[] buf = new byte[1024];
int len = is.read(buf);
System.out.println(new String(buf,0,len));
s.close();
}
}
class ServerSocket2{
public static void main(String[] args) throws IOException {
ServerSocket ss = new ServerSocket(10009);
Socket s = ss.accept();
System.out.println(s.getInetAddress().getHostAddress());
InputStream is = s.getInputStream();
byte[] buf = new byte[1024];
int len = is.read(buf);
System.out.println(new String(buf,0,len));
OutputStream os = s.getOutputStream();
os.write("收到,你也好".getBytes());
s.close();
ss.close();
}
}
/*
需求:建立一个文本转换服务器。
客户端给服务端发送文本,服务端会将文本转成大写再返回给客户端
而且客户端可以不断的进行文本转换,当客户端输入over时,转换结束。
注意用字符缓冲区,readLine()方法的结束标记,还有BufferWriter缓冲区要刷新。
还有PrintWriter打印流的应用。可以接收字节流和字符流。
*/
import java.io.BufferedReader;
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.net.UnknownHostException;
class SocketTest{
public static void main(String[] args) throws UnknownHostException, IOException {
Socket s = new Socket("127.0.0.1",10009);
BufferedReader bufr = new BufferedReader(//读取键盘
new InputStreamReader(System.in));
String line = null;
OutputStream os = s.getOutputStream();
InputStream is = s.getInputStream();//读取返回的数据
byte[] buf = new byte[1024];
while((line = bufr.readLine())!=null){
os.write(line.getBytes());
if("over".equals(line))
break;
int len = is.read(buf);
String text = new String(buf,0,len);
System.out.println("server:"+text);
}
}
}
class ServerSocketTest{
public static void main(String[] args) throws IOException {
ServerSocket ss = new ServerSocket(10009);
Socket s = ss.accept();
InputStream is = s.getInputStream();
OutputStream os = s.getOutputStream();
byte[] buf = new byte[1024];
int len = 0;
while(true){
len = is.read(buf);
String text = new String(buf,0,len);
System.out.println("socket:"+text);
os.write(text.toUpperCase().getBytes());
if("over".equals(text))
break;
}
}
}
import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;
//复制各种文件的TCP传输
class CopySocket{
public static void main(String[] args) throws Exception {
Socket s = new Socket("127.0.0.1",10007);
File file = new File("1.jpg");
if(!(file.exists()))
throw new RuntimeException("文件不存在");
BufferedInputStream in = new BufferedInputStream(
new FileInputStream(file));
BufferedOutputStream bufout = new BufferedOutputStream(
s.getOutputStream());
byte[] buf = new byte[1024];
int len = 0;
while((len = in.read(buf))!=-1){
bufout.write(buf, 0, len);
bufout.flush();
}
s.shutdownOutput();//记得定义结束标记
BufferedReader bufin = new BufferedReader(new InputStreamReader(
s.getInputStream()));
String line = bufin.readLine();
System.out.println(line+"over");
in.close();
s.close();
}
}
class CopyServerSocket{
public static void main(String[] args) throws Exception {
ServerSocket ss = new ServerSocket(10007);
Socket s = ss.accept();
BufferedInputStream bufin = new BufferedInputStream(
s.getInputStream());
BufferedOutputStream out = new BufferedOutputStream(
new FileOutputStream("2copy2.jpg"));
byte[] buf = new byte[1024];
int len = 0;
while((len = bufin.read(buf))!=-1){
out.write(buf, 0, len);
out.flush();
}
out.close();
BufferedWriter bufout = new BufferedWriter(new OutputStreamWriter(
s.getOutputStream()));
bufout.write("复制成功!!!");
bufout.flush();//缓冲写入一定要刷新!!!!!!!!!!!!!
//PrintWriter pw = new PrintWriter(s.getOutputStream(),true);
//pw.println("复制成功!!!");
System.out.println("server over");
s.close();
}
}