java 网络编程
通俗的来说, 网络编程就是编写程序,让联网的两个或多个设备(例如计算机)之间进行数据传输。Java语言也支持网络编程,JDK提供的 java.net包提供了很多于网络编程相关的类,来支持网络编程方面的学习。这一节一般分为三小节,都不难知道思路就算是熟记了;
URL
URL是英语Uniform Resource Locator的简称,中文统一资源定位符的意思。是对可以从互联网上得到的资源位置和访问方法的一种简洁表示,是互联网上标准资源的地址。
接下来是怎么用了:有三种简单常用方法,我感觉需要记住的也就是一个URL的openstream()方法获取到io流之后就是一个简单的io流操作了;
/*
* 第一次操作是会有乱码的;是直接用了URL
* 第二次是把URL扔到inputstreamreder的构造器里边了,他是可以指定编码集的;然后就是用bufferedreader可以增加效率;
*/
public static void main(String[] args) throws IOException {
/*try(InputStream is = new URL("http://www.baidu.com").openStream();){
int temp = -1;
while((temp=is.read())!=-1) {
System.out.print((char)temp);
}}catch(Exception e ) {
System.out.println("操作异常");
}*/
// test();
text2();
}
public static void test() throws MalformedURLException, IOException {
try(BufferedReader reader = new BufferedReader(new InputStreamReader(new URL("http://www.baidu.com").openStream(),"utf8"))){
String msg;
while((msg=reader.readLine())!=null) {
System.out.println(msg);
}}catch(Exception e) {
System.out.println("操作异常");
}
}
public static void text2() throws IOException {
//读取到一个文件加里边;
try(BufferedReader reader = new BufferedReader(new InputStreamReader(new URL("http://www.baidu.com").openStream(),"utf8"));
BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(new FileOutputStream("baidu.html"),"utf8"));){
//这个地方是也是可以指定字符集的;不要是用工程的字符集;
String msg;
while((msg=reader.readLine())!=null) {
writer.write(msg);
writer.newLine();//为什么这个地方是没有换行的;
}
}
}
udp
udp是个协议,跟tcp一样他俩都是协议;
udp协议:
a)将数据封装到包中,不需要建立连接,面向无连接的数据传输,从而也是不可靠的。
b)每个数据包的大小不超过64k
c)由于不需要建立连接,所以,传输是高效的
发短信就是一种udp,我们可能经历过那种,过年了群发祝福可能对方收不到(丢包),过完年才收到(服务器阻塞延迟),等等在2G时代都是很广泛存在的;
使用udp编程大致思路如下(使用了多线程让两者实现能够通信(不适用多线程那只能够你一句我一句这种样子,有了多线程可以将收发都分开,实现群聊也是这个思路,必须是分开的!)):
//一个接受端,封装起来了便于多人用;
public class TalkRecevie implements Runnable{
private DatagramSocket server;
public TalkRecevie(int port) {
try {
server = new DatagramSocket(port);
} catch (SocketException e) {
e.printStackTrace();
}
}
@Override
public void run() {
while(true) {
//使用DatagramSocket 指定端口 创建接收端
byte[] container = new byte[1024*60];
DatagramPacket packet = new DatagramPacket(container,0,container.length);
//阻塞式接受包裹receive(DatagramPacket p),注意这个阻塞式!
try {
server.receive(packet);
byte[] datas = packet.getData();
int len = packet.getLength();
String str = new String(datas,0,len);
System.out.println(str);
if(str.equals("bye")) {
break;
}
} catch (Exception e) {
e.printStackTrace();
}
}
server.close();
}
}
public class TalkSend implements Runnable{
private DatagramSocket client;
private BufferedReader reader;
private String toIP;
private int toPort;
public TalkSend(int port,String toIP, int toPort) {
this.toIP = toIP;
this.toPort = toPort;
try {
client = new DatagramSocket(port);
reader = new BufferedReader(new InputStreamReader(System.in));
} catch (SocketException e) {
e.printStackTrace();
}
}
@Override
public void run() {
System.out.println("发送方启动中....");
//使用DatagramSocket 指定端口 创建发送端
while(true) {
try {
//准备数据一定转成字节数组;
String data = reader.readLine();
byte[] datas = data.getBytes();
//封装成DatagramPacket 包裹,需要指定目的地
DatagramPacket packet = new DatagramPacket(datas,0,datas.length,
new InetSocketAddress(this.toIP,this.toPort));
//发送包裹send(DatagramPacket p)*
client.send(packet);
//释放资源
if(data.equals("bye")) {
break;
}
}catch(Exception e) {
e.printStackTrace();
}
}
client.close();
}
//建立一个基于两个类的聊天实现
public class TextStudents {
public static void main(String[] args) {
new Thread(new TalkSend(8880,"localhost",9999)).start();//自己使用的端口,toip,toport;
new Thread(new TalkRecevie(7777)).start();
}
}
//第二个
public class TextTeacher {
public static void main(String[] args) {
new Thread(new TalkSend(8888,"localhost",7777)).start();
new Thread(new TalkRecevie(9999)).start();
}
}
tcp
tcp协议:
a)建立连接,从而形成可靠的传输通道
b)可以传输大量的数据
c)数据传输可靠的,通过三次握手来保证可靠性
d)必须建立连接,效率会稍慢。
先来看一个简单的server-client实例:
//tcp服务端
public class TcpServer {
public static void main(String[] args) throws IOException {
ServerSocket server = new ServerSocket(8888);
Socket client = server.accept();
System.out.println("一个客户端建立了链接");
InputStream is = client.getInputStream();
byte[] b = new byte[1024];
int len = -1;
while((len=is.read(b))!=-1) {
System.out.println("可以");
}
/*DataInputStream dis = new DataInputStream(client.getInputStream());
String data = dis.readUTF();
System.out.println(data);*/
/*client.close();
server.close();*/
}
}
//tcp发送端
public class TcpSend {
public static void main(String[] args) throws IOException {
System.out.println("---------Client----------");
Socket client = new Socket("localhost",8888);
// DataOutputStream dos = new DataOutputStream(client.getOutputStream());
String data = "hello";
OutputStream os = client.getOutputStream();
String msg = "测试";
os.write(msg.getBytes());
/*dos.writeUTF(data);
dos.flush();*/
client.close();
}
}
同理这里边也没有用多线程,他们也是只能够你一言我一句的发送,不能实现真正意义上的通讯的;当然办法很多,想要了解更多那就直接通过一个群聊小项目来加深理解吧,下边附有链接;