java基础笔记(7)
Socket编程
通信基础:ip地址(位置)、协议(语言)、端口(软件程序);
java提供网络功能的四大类:

InetAddress没有构造函数,不够里面有一些方法是可以返回实例,如:
InetAddress.getLocalHost();返回本机的实例;
InetAddress.getByName(String NAME);根据主机名或ip返回实例;
URL类实例化后可以获取URL的主机名、端口、文件的路径、文件名等等信息,需要注意的是,如果URL在实例化时没有指定端口号,会传入默认端口号,通过url.getPort()获取的端口号是-1而不是80;
URL提供了一个openStream(),用来获取URL的输入流,例:
public void urlTest() throws IOException {
URL baidu = new URL("http://www.baidu.com");
InputStream in = baidu.openStream();//获取URL的输入流,此时输入流是字节数组
InputStreamReader isr = new InputStreamReader(in,"utf-8");//将输入流转换为字符输入流
BufferedReader br = new BufferedReader(isr);//为字符流添加缓冲
String data = br.readLine();
while(data!=null) {
System.out.println(data);
data = br.readLine();
}
br.close();
isr.close();
in.close();
}
给予TCP协议实现网络通信的类:
客户端:Socket类
服务器端;ServerSocket类
Socket实现通信的步骤:

常用的创建构造方法及常用方法:
ServerSocket类:
构造方法:
ServerSocket(int port);指定端口号创建ServerSocket类;
调用方法:
accept();监听并接收此套接字的连接,返回一个Socket;
close();关闭套接字
getInetAddress(),返回InetAddress类,返回服务器的本地地址;
getLocalPort(),返回int类,返回套接字监听的接口;
Socket类:
构造方法:
Socket(String host,int port);指定主机地址和端口创建Socket类;
调用方法;
close();关闭套接字
getInetAddress(),返回InetAddress类,返回套接字的本地地址;
getLocalPort(),返回int类,返回套接字绑定的接口;
getInputStream(),返回InputStream类,获取套接字的输入流
getOutputStream(),返回OutputStream类,获取套接字的输出流
通过Socket编码演示实现服务器端和客户端之间的通讯:
服务器端:
package com.Socket; import java.io.BufferedInputStream;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket; public class server {
public static void main(String[] args) throws IOException {
ServerSocket serversocket = new ServerSocket(8889);//创建服务器套接字
System.out.println("===服务器即将启动,正在等待客户端的连接===");
Socket socket = serversocket.accept();//开始监听,等待客户端的连接
InputStream in = socket.getInputStream();//获取输入流
InputStreamReader inr = new InputStreamReader(in);//将字节输入流转为字符输入流
BufferedReader binr = new BufferedReader(inr);//将输入流添加到缓冲流
String info =null;
while((info = binr.readLine())!=null) {
System.out.println("我是服务器,客户端说:"+info);
}
socket.shutdownInput();
OutputStream output = socket.getOutputStream();
PrintWriter pw = new PrintWriter(output);
pw.write("欢迎您");
pw.flush();
pw.close();
binr.close();
inr.close();in.close();
socket.close();
serversocket.close();
}
}
客户端:
package com.Socket; import java.io.BufferedInputStream;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.PrintWriter;
import java.net.Socket;
import java.net.UnknownHostException; public class client {
public static void main(String[] args) throws UnknownHostException, IOException {
Socket socket = new Socket("localhost",8889);//创建客户端Socket套接字
OutputStream output = socket.getOutputStream();//创建字节输出流
PrintWriter pw = new PrintWriter(output);//将输出流包装为打印流
pw.write("用户名:admin;密码:123");
pw.flush();
socket.shutdownOutput();
InputStream in = socket.getInputStream();
BufferedReader br = new BufferedReader(new InputStreamReader(in));
String info;
while((info = br.readLine())!=null) {
System.out.print("客户端对我说:"+info);
}
br.close();
in.close();
pw.close();
output.close();
socket.close();
} }
多线程的通信:
建立一个线程类:
package com.Socket; import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.PrintWriter;
import java.net.Socket; public class ServerThread extends Thread {
Socket socket = null;
public ServerThread(Socket socket) {
this.socket = socket;
}
public void run() {
try {
InputStream in = socket.getInputStream();//获取输入流
InputStreamReader inr = new InputStreamReader(in);//将字节输入流转为字符输入流
BufferedReader binr = new BufferedReader(inr);//将输入流添加到缓冲流
String info =null;
while((info = binr.readLine())!=null) {
System.out.println("我是服务器,客户端说:"+info);
}
socket.shutdownInput();
OutputStream output = socket.getOutputStream();
PrintWriter pw = new PrintWriter(output);
pw.write("欢迎您");
pw.flush();
if(pw!=null)
pw.close();
if(binr!=null)
binr.close();
if(inr!=null)
inr.close();
if(in!=null)
in.close();
if(socket!=null)
socket.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
在服务器类中循环调用accept()方法并不断实例化线程类,在accept()连接返回一个Socket后又继续调用进行监听:
package com.Socket; import java.io.BufferedInputStream;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.net.InetAddress;
import java.net.ServerSocket;
import java.net.Socket; public class server {
public static void main(String[] args) throws IOException {
ServerSocket serversocket = new ServerSocket(8889);//创建服务器套接字
Socket socket = null;
int count = 0;
System.out.println("===服务器即将启动,正在等待客户端的连接===");
while(true) {
socket = serversocket.accept();
//开始监听,等待客户端的连接
ServerThread serverthread = new ServerThread(socket);
serverthread.start();
count++;
System.out.println("客户端的数量:"+count);
InetAddress address =socket.getInetAddress();
System.out.println("客户端的IP:"+address);
}
}
}
这样既可实现多客户端的多次连接;
UDP信息传输

DatagramPacket:表示数据报包
DatagramSocket:表示端到端通信的类


服务器端:
package com.Socket; import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.net.SocketException; public class Udpserver {
public static void main(String[] args) throws IOException {
DatagramSocket socket = new DatagramSocket(8887);//创建Socket
byte[] data = new byte[1024];//创建数组,在创建数据报的时候需将该字节数组传入
DatagramPacket packet = new DatagramPacket(data, data.length);//创建数据报,将数据传入数组中
System.out.println("服务器已经启动,正在等待客户端的连接=====");
socket.receive(packet);//等待接收数据报,在接收前会一直阻塞
String info = new String(data,0,packet.getLength());
System.out.println("我是服务器,客户端发来信息:"+info);
//向客户端相应数据
InetAddress address = packet.getAddress();//根据传过来的数据报获取客户端的地址
int port = packet.getPort();//获取客户端端口
byte[] data2 = "欢迎您".getBytes();
DatagramPacket packet2 = new DatagramPacket(data2, data2.length,address,port);
socket.send(packet2);
socket.close();
}
}
客户端:
package com.Socket; import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.net.SocketException;
import java.net.UnknownHostException; public class Udpclient {
public static void main(String[] args) throws IOException {
InetAddress adress = InetAddress.getByName("localhost");
int port = 8887;
byte[] data = "用户名:admin;密码:123".getBytes();//定义发送信息并存到字节数组中
DatagramPacket packet =new DatagramPacket(data,data.length,adress,port);//将定义好的字节数组和传送的目标地址,目标端口封装成数据报
DatagramSocket socket = new DatagramSocket();//创建socket套接字
socket.send(packet);//发送数据报
byte[] data3 = new byte[1024];
DatagramPacket packet3 =new DatagramPacket(data3,data3.length);
socket.receive(packet3);
String info2 = new String(data3,0,packet3.getLength());
System.out.println("服务器对我说:"+info2);
socket.close();
}
}
java基础笔记(7)的更多相关文章
- Java基础笔记 – Annotation注解的介绍和使用 自定义注解
Java基础笔记 – Annotation注解的介绍和使用 自定义注解 本文由arthinking发表于5年前 | Java基础 | 评论数 7 | 被围观 25,969 views+ 1.Anno ...
- 【转】Java基础笔记 – 枚举类型的使用介绍和静态导入--不错
原文网址:http://www.itzhai.com/java-based-notes-introduction-and-use-of-an-enumeration-type-static-impor ...
- 黑马程序员----java基础笔记中(毕向东)
<p>------<a href="http://www.itheima.com" target="blank">Java培训.Andr ...
- 黑马程序员----java基础笔记上(毕向东)
------Java培训.Android培训.iOS培训..Net培训.期待与您交流! ------- 笔记一共记录了毕向东的java基础的25天课程,分上.中.下 本片为上篇,涵盖前10天课程 1. ...
- Java基础笔记1
java (开源,跨操作系统)j2ee jre java基础 javaoop java高级 JDK(JAVA developer Kitool): java开发工具 (开发人员使用) JRE(java ...
- Java基础笔记(一)——JDK、JRE、JVM
JDK.JRE和JVM三者的关系 Java程序执行过程 JVM(java virtual machine) 注:由于各种操作系统(windows.linux等)支持的指令集(二进制可执行代码)不同,程 ...
- Java基础笔记05-06-07-08
五.今日内容介绍 1.方法基础知识 2.方法高级内容 3.方法案例 01方法的概述 * A: 为什么要有方法 * 提高代码的复用性 * B: 什么是方法 * 完成特定功能的代码块. 02方法的定义格式 ...
- Java基础笔记-抽象,继承,多态
抽象类: abstract修饰 抽象方法必须定义在抽象类中,抽象类不能创建对象. 在抽象方法中可以不定义抽象方法,作用是:让该类不能建立对象. 特点是: 1.定义在抽象类中 2.方法和类都用abstr ...
- Java基础笔记(一)
本文主要是我在看<疯狂Java讲义>时的读书笔记,阅读的比较仓促,就用 markdown 写了个概要. 第一章 Java概述 Java SE:(Java Platform, Standar ...
- JAVA基础笔记10-11-12-13-14
十.今日内容介绍 1.继承 2.抽象类 3.综合案例---员工类系列定义 01继承的概述 *A:继承的概念 *a:继承描述的是事物之间的所属关系,通过继承可以使多种事物之间形成一种关系体系 *b:在J ...
随机推荐
- 013:URL传参数
URL传参数有两种方式: 1.采用在URL中使用变量的方式:在path的第一个参数中,使用'<参数名>'的方式可以传递参数,然后在对于的视图函数中也要写一个参数,并且视图函数中的参数名和U ...
- c++ copy和operator =
目录(?)[+] 构造函数 拷贝构造函数 赋值函数 C++中一般创建对象,拷贝或赋值的方式有构造函数,拷贝构造函数,赋值函数这三种方法.下面就详细比较下三者之间的区别以及它们的具体实现 1.构造函 ...
- VUEX报错 [vuex] Do not mutate vuex store state outside mutation handlers
数组 错误的写法:let listData= state.playList; // 数组深拷贝,VUEX就报错 正确的写法:let listDate= state.playList.slice(); ...
- 参数类型*&是什么意思?
前两天摸鱼聊天的时候遇到一个问题,一个链表的函数中,有一个参数显得很奇怪 (大概是一个样子的)ListNode<T>*& l 这个参数l除了用了一个*之外还用了一个&,直觉 ...
- 神经网络内在逻辑:没打开的AI“黑匣子”
转载自:http://www.elecfans.com/rengongzhineng/592200.html 伴随着大数据,AI在沉寂了多年之后,又迎来了新的高潮.在这场涉及大部分科学的革命中,人工神 ...
- for循环,foreach, map,reduce用法对比+for in,for of
for不做赘述,相当简单: foreach方法: forEach() 方法用于调用数组的每个元素,并将元素传递给回调函数. 注意: forEach() 对于空数组是不会执行回调函数的. array.f ...
- HBase 集群监控系统构建
HBase 集群监控系统构建 标签(空格分隔): Hbase 一, 集群为什么需要监控系统 总的来说是为了保证系统的稳定性,可靠性,可运维性.具体来说我认为有以下几点: 掌控集群的核心性能指标,了解集 ...
- android api文档:intent阅读笔记
intent是几大组件之间进行通信的组件.可以包含以下几个部分: component:指明了处理该intent的对象. Action类似于一个函数名,规定了其他部分的对应用法: The action ...
- (转载)Kaggle_Titanic生存预测 -- 详细流程吐血梳理
Kaggle_Titanic生存预测 -- 详细流程吐血梳理 https://blog.csdn.net/Koala_Tree/article/details/78725881 Kaggle中Tita ...
- 微信小程序 API 路由
路由:由于页面的跳转: wx.switchTab() 跳转到 tabBar 页面,并关闭掉其他所有非 tabBar 页面: 参数:为对象, 对象的属性: url:需要跳转的 tabBar 的页面路径( ...