Java的网络编程:小程序能实现记时的聊天室
网络通讯的底层协议有两个:
一、TCP协议:
可靠的传输协议。长连接,一直连着发送。一发一回应。弊端:啰嗦,占用带宽高,传输速度慢!
二、UDP协议
不可靠传输协议。简洁,对方爱收不收,草率。快,不废话不罗嗦。无所谓!(网络上UDP协议用的更多)
例如:网游、视频传输、语言(卡了,丢包了。哈哈哈哈o(^▽^)o)
只说一便,不重复,不罗嗦。
C-S:客户端对服务端(用户电脑上会有大量的客户端)
--->浏览器(统一客户端)
B-S:浏览器对服务端(算C-S的一种)
手机又回到了C-S,大众的东西就不能做的很个性。
QQ的浏览器版就很土。
java中就主要讲TCP协议了,来实现聊天室。
java封装的好处,帮你屏蔽底层复杂的事情。上层公开出一个非常简洁的可调用的技术。
例如,开车就只要会挂档和方向盘、油门,就可开车。底层发动机怎么运行不需要。
Socket:套接字(插座)
电话,无线电通讯
***********************************************************************************
先启动服务端,再启动客户端。
怎么看客户端的输出?
在控制台console右边有个小电脑图标,下拉框,可切换。
快速切换就直接点图标。
以上是自己和自己连。
下面是两个人互相连。
知道对方的IP地址是多少?
windows:输入cmd--->命令提示符。
再输入---> ipconfig
linux:打开终端。
再输入---> /sbin/ifconfig
**********************************************************************************
**********************************************************************************
package day11;
import java.io.BufferedReader;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.ServerSocket;
import java.net.Socket;
public class Server {
/**
* java.net.ServerSocket
* 运行在服务端的Socket,主要有两个作用:
* 1:向操作系统申请服务端口,客户端就是通过这个端口找到服务端应用程序的
* 2:监听服务端口,当客户端实例化Socket并通过ServerSocket服务端口发起连接时,
* ServerSocket就能感知到并实例化一个Socket与该客户端通讯。
*/
private ServerSocket server;
public Server(){
try {
/**
* 实例化ServerSocket的同时指定服务端口
* 该端口不能与操作系统上其他应用程序已经申请的端口冲突,否则实例化失败,
* 抛出地址被占用的异常。
*/
server= new ServerSocket(8088);
} catch (Exception e) {
}
}
public void start(){
try {
/*
* ServerSocket提供方法
* Socket accept()
* 该方法是一个阻塞方法,作用是监听服务端口,直到一个客户端连接过来为止,
* 然后返回一个Socket实例,通过该Socket就可以与刚连接的客户端交互数据了。
*/
System.out.println("等待客户端连接...");
Socket socket= server.accept();
System.out.println("一个客户端连接了!");
/*
* Socket提供了方法:
* InputStream getInputStream()
* 通过该输入流可以读取远端计算机发送过来的消息。
*/
InputStream in= socket.getInputStream();
InputStreamReader isr= new InputStreamReader(in,"UTF-8");
BufferedReader br= new BufferedReader(isr);
String message= br.readLine();
System.out.println("客户端说:"+message);
} catch (Exception e) {
e.printStackTrace();
}
}
public static void main(String[] args) {
try {
Server server= new Server();
server.start();
} catch (Exception e) {
e.printStackTrace();
}
}
}
**********************************************************************************
**********************************************************************************
package day11;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.net.Socket;
/**
* 聊天室客户端
* @author Daisy.yang
*
*/
public class Client {
/*
*java.net.Socket
*Socket封装了TCP协议,使用它可以进行TCP通讯。
*/
private Socket socket;
/**
* 构造方法,用来初始化客户端
*/
public Client(){
try {
/*
* 实例化Socket时需要传入两个参数:
* 1:服务端计算机的IP地址,通过它可以找到网络上的服务端计算机。
* 2:服务端口,该端口是服务端程序启动后向它的计算机申请的,
* 我们通过这个端口就可以找到运行服务端计算机上的这个服务端
* 应用程序了。
*
* 而且实例化Socket过的程序就是连接服务端的过程,
* 在实例化时就会按照给定的地址与端口进行网络连接,
* 若服务端没有响应,这里会抛出异常。
*
* localhost:表示本机地址,连接本机。
* 127.0.0.1
* 或者看自己的IP地址
*/
System.out.println("正在连接服务端...");
socket= new Socket("localhost",8088);
System.out.println("已连接!");
} catch (Exception e) {
e.printStackTrace();
}
}
/**
* 开始客户端工作的方法
*/
public void start(){
try {
/*
* Socket提供方法:
* OutputStream getOutputStream()
* 该方法会获取一个输出流,通过该流写出的数据会发给远端计算机
* 对于客户端这边而言,远端就是服务端。
*/
OutputStream out= socket.getOutputStream();
OutputStreamWriter osw= new OutputStreamWriter(out,"UTF-8");
PrintWriter pw= new PrintWriter(osw);
pw.println("Hello!服务端!");
pw.flush();
} catch (Exception e) {
e.printStackTrace();
}
}
public static void main(String[] args) {
try {
Client client = new Client();
client.start();
} catch (Exception e) {
e.printStackTrace();
}
}
}
**********************************************************************************