网络编程
网路编程:在两台不同的计算机之间传递数据
比如一个网址http://www.baidu.com/search?code=android&type=1
http/https:传输协议 Tcp/IP
- www.baidu.com:域名 表示一台网路中的电脑
- DNS服务器:域名解析 将www.baidu.com类型的域名解析为对应的ip地址
- search 对应的后台程序文件 php java jsp
- ?表示运行这个参数需要传递的参数
- code=android code是服务器端规定的字段
- &如果有多个参数使用&符号链接
- ipv4 ipv6地址:唯一标识一台网络中的计算机
- 32位:四个部分每个是8个字节
网络中的数据传输:Socket实现->套接字 - Socket:客户端
- SoverSocket:服务器端
- 读取数据:服务器读取 客户端读取
- BufferedRead->InputStream->socket.getInputStream;
- 读取终端
- BufferedWriter->IutputStreamReader->System.in
- 输出:客户端输出 服务器端输出
- BufferedWriter->OutputStreamWriter->socket.getOutputStream();
- PrintStream->socket.getOutputStream();
代码引用
用网络编程写一个简单的程序
*手动输入内容 发送
- socket扮演的是客户端
- ServerSocket扮演的是服务器端
class Myclient{
public static void main(String[] args){
Socket socket=null;
try {
socket=new Socket("10.40.165.111",8888);
BufferedReader br=new BufferedReader(new InputStreamReader(socket.getInputStream()));
String line=null;
while((line=br.readLine())!=null){
System.out.println(line);
}
} catch (IOException e) {
e.printStackTrace();
}finally{
try {
socket.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
下面是Server类(服务器端)
class MyServer{
public static void main(String[] args){
try(ServerSocket ss=new ServerSocket(8888)) {
Socket socket=ss.accept();
BufferedReader keyin=new BufferedReader(new InputStreamReader(System.in));
PrintStream ps=new PrintStream(socket.getOutputStream());
String line=null;
while((line=keyin.readLine())!=null){
ps.println();
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
先运行服务器端,在运行客户端
多线程网络编程
实现功能
客户端和服务器端都可以随意发送地发送内容
- 从终端输入
- 实现对聊
- 客户端:
主线程:接收终端输入 将终端的输入发送给服务器端
子线程:接收服务器端发过来的数据 - 服务器端
主线程:接收终端输入 将终端输入发送给客户端
子线程:接收客户端发过来的数据
我们就在各自的端口实现子线程就行了
代码引用
class client{
public static void main(String[] args) throws IOException {
Socket socket=new Socket("10.80.194.172",8888);
new Thread(new ClientThread(socket)).start();
BufferedReader br=new BufferedReader(new InputStreamReader(System.in));
PrintStream ps=new PrintStream(socket.getOutputStream());
String line=null;
while ((line=br.readLine())!=null){
ps.println(line);
}
}
}
/**
* 创建一个子线程
*/
class ClientThread implements Runnable{
private Socket socket;
public ClientThread(Socket socket){
this.socket=socket;
}
@Override
public void run() {
BufferedReader br=null;
try {
br=new BufferedReader(new InputStreamReader(socket.getInputStream()));
//读取数据
String line=null;
while((line=br.readLine())!=null){
System.out.println(line);
}
} catch (IOException e) {
e.printStackTrace();
System.out.println("网络出错 请重新登入");
System.exit(-1);
}finally{
try {
if (br != null) {
br.close();
}
if (socket != null) {
socket.close();
}
}
catch (IOException e) {
e.printStackTrace();
}
}
}
}
class Server {
public static void main(String[] args) throws IOException {
ServerSocket ss = new ServerSocket(8888);
Socket socket = ss.accept();
new ServerThread(socket).start();
//终端输入流对象
BufferedReader keyin = new BufferedReader(new InputStreamReader(System.in));
//客户端输出流对象
PrintStream ps = new PrintStream(socket.getOutputStream());
String line = null;
while ((line = keyin.readLine()) != null) {
ps.println(line);
}
}
}
class ServerThread extends Thread{
private Socket socket;
public ServerThread (Socket socket){
this.socket=socket;
}
@Override
public void run() {
try {
BufferedReader br=new BufferedReader(new InputStreamReader(socket.getInputStream()));
String line=null;
while ((line=br.readLine())!=null){
System.out.println(line);
}
} catch (IOException e) {
e.printStackTrace();
System.out.println("网络出错 请重新登入");
System.exit(-1);
}
super.run();
}
}
其实就是对Socket类和ServerSocket的灵活利用