Day28-C:\Users\Lenovo\Desktop\note\code\JavaSE\Basic\src\com\IPDemo\BSDemo+TCP
TCP
package Basic.src.com.IPDemo.TCPDemo.Demo01;
import java.io.DataOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.net.Socket;
public class Client {
public static void main(String[] args) throws Exception {
//1.创建一个socket对象,并同时请求与服务端程序连接
Socket socket = new Socket("127.0.0.1", 8888);//socket管道
//2.从socket通信管道中得到一个字节输出流,用来发数据给服务端程序
OutputStream os = socket.getOutputStream();
//3.把低级的字节输出流包装成数据输出流
DataOutputStream dos = new DataOutputStream(os);
//4.开始写数据出去
dos.writeUTF("在一起,好吗?");
dos.close();//关闭外部包装流会同时关闭内部的流
//5.关闭管道,释放资源
socket.close();
}
}
package Basic.src.com.IPDemo.TCPDemo.Demo01;
import java.io.DataInputStream;
import java.io.InputStream;
import java.net.DatagramSocket;
import java.net.ServerSocket;
import java.net.Socket;
public class Server {
public static void main(String[] args) throws Exception {
System.out.println("=============服务端已开启============");
//1.创建ServerSocket对象,同时为服务端注册端口
ServerSocket serverSocket = new ServerSocket(8888);
//2.使用ServerSocket对象,调用一个accept方法,等待客户端的连接请求
Socket socket = serverSocket.accept();//启动后在此阻塞等待
//3.从socket通信管道中获得一个字节输入流
InputStream is = socket.getInputStream();
//4.把原始低级的字节输入流包装成数据输入流
DataInputStream dis = new DataInputStream(is);
//5.使用数据输入流读取客户端数据
String rs = dis.readUTF();//第二次阻塞等待
System.out.println(rs);
//其实我们也可以获取客户端的ip地址
System.out.println(socket.getRemoteSocketAddress());
dis.close();
socket.close();
//serverSocket.close();
}
}
多发多收
package Basic.src.com.IPDemo.TCPDemo.Demo02;
import java.io.DataOutputStream;
import java.io.OutputStream;
import java.net.Socket;
import java.util.Scanner;
public class Client {
public static void main(String[] args) throws Exception {
//1.创建一个socket对象,并同时请求与服务端程序连接
Socket socket = new Socket("127.0.0.1", 8888);//socket管道
//2.从socket通信管道中得到一个字节输出流,用来发数据给服务端程序
OutputStream os = socket.getOutputStream();
//3.把低级的字节输出流包装成数据输出流
DataOutputStream dos = new DataOutputStream(os);
//让用户输入消息
Scanner sc = new Scanner(System.in);
while (true) {
System.out.println("请说:");
String msg = sc.nextLine();
//一旦用户输入了"exit",就退出客户端程序
if (msg.equals("exit")) {
System.out.println("欢迎您下次光临,退出成功!");
dos.close();
socket.close();
break;
}
//4.开始写数据出去
dos.writeUTF(msg);
dos.flush();//刷新出去,防止数据还在客户端的内存中:立即发生给服务端
}
// dos.close();//关闭外部包装流会同时关闭内部的流
//
// //5.关闭管道,释放资源
// socket.close();
}
}
package Basic.src.com.IPDemo.TCPDemo.Demo02;
import java.io.DataInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.ServerSocket;
import java.net.Socket;
public class Server {
public static void main(String[] args) throws Exception {
System.out.println("=============服务端已开启============");
//1.创建ServerSocket对象,同时为服务端注册端口
ServerSocket serverSocket = new ServerSocket(8888);
//2.使用ServerSocket对象,调用一个accept方法,等待客户端的连接请求
Socket socket = serverSocket.accept();//启动后在此阻塞等待
//3.从socket通信管道中获得一个字节输入流
InputStream is = socket.getInputStream();
//4.把原始低级的字节输入流包装成数据输入流
DataInputStream dis = new DataInputStream(is);
while (true) {
try {
//5.使用数据输入流读取客户端数据
String rs = dis.readUTF();//第二次阻塞等待
System.out.println(rs);
//其实我们也可以获取客户端的ip地址
System.out.println(socket.getRemoteSocketAddress());
} catch (IOException e) {
System.out.println(socket.getRemoteSocketAddress()+"离线了");
dis.close();
socket.close();
break;
}
}
// dis.close();
// socket.close();
//serverSocket.close();
}
}
多客户端通信:引入多线程
package Basic.src.com.IPDemo.TCPDemo.Demo03;
import java.io.DataOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.net.Socket;
import java.util.Scanner;
public class Client {
public static void main(String[] args) throws Exception {
//1.创建一个socket对象,并同时请求与服务端程序连接
Socket socket = new Socket("127.0.0.1", 8888);//socket管道
//2.从socket通信管道中得到一个字节输出流,用来发数据给服务端程序
OutputStream os = socket.getOutputStream();
//3.把低级的字节输出流包装成数据输出流
DataOutputStream dos = new DataOutputStream(os);
//让用户输入消息
Scanner sc = new Scanner(System.in);
while (true) {
System.out.println("请说:");
String msg = sc.nextLine();
//一旦用户输入了"exit",就退出客户端程序
if (msg.equals("exit")) {
System.out.println("欢迎您下次光临,退出成功!");
dos.close();
socket.close();
break;
}
//4.开始写数据出去
dos.writeUTF(msg);
dos.flush();//刷新出去,防止数据还在客户端的内存中:立即发生给服务端
}
}
}
多线程设置
package Basic.src.com.IPDemo.TCPDemo.Demo03;
import java.io.DataInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.Socket;
public class ServerReaderThread1 extends Thread {
private Socket socket;
public ServerReaderThread1(Socket socket) {
this.socket = socket;
}
@Override
public void run() {
try {
InputStream is = socket.getInputStream();
DataInputStream dis = new DataInputStream(is);
while (true) {
String msg = null;
try {
msg = dis.readUTF();
} catch (Exception e) {
System.out.println("有人下线了:"+socket.getRemoteSocketAddress());
dis.close();
socket.close();
break;
}
System.out.println(msg);
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
即时通信
群聊
package Basic.src.com.IPDemo.TCPDemo.Demo04Forward;
import java.io.DataOutputStream;
import java.io.OutputStream;
import java.net.Socket;
import java.util.Scanner;
public class Client {
public static void main(String[] args) throws Exception {
//1.创建一个socket对象,并同时请求与服务端程序连接
Socket socket = new Socket("127.0.0.1", 8888);//socket管道
//TCP 的三次握手完成后,程序才会执行 Socket socket = new Socket("127.0.0.1", 8888); 之后的代码。
//三次握手:
//客户端发送 SYN 包(请求连接);
//服务端回复 SYN+ACK 包(同意连接);
//客户端回复 ACK 包(确认连接)。
//创建一个独立线程,负责随机从socket中接收服务端发过来的信息
new ClentReaderThread(socket).start();
//2.从socket通信管道中得到一个字节输出流,用来发数据给服务端程序
OutputStream os = socket.getOutputStream();
//3.把低级的字节输出流包装成数据输出流
DataOutputStream dos = new DataOutputStream(os);
//让用户输入消息
Scanner sc = new Scanner(System.in);
while (true) {
System.out.println("请说:");
String msg = sc.nextLine();
//一旦用户输入了"exit",就退出客户端程序
if (msg.equals("exit")) {
System.out.println("欢迎您下次光临,退出成功!");
dos.close();
socket.close();
break;
}
//4.开始写数据出去
dos.writeUTF(msg);
dos.flush();//刷新出去,防止数据还在客户端的内存中:立即发生给服务端
}
}
}
package Basic.src.com.IPDemo.TCPDemo.Demo04Forward;
import java.io.DataInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.Socket;
public class ClentReaderThread extends Thread{
private Socket socket;
public ClentReaderThread(Socket socket){
this.socket = socket;
}
@Override
public void run() {
try {
InputStream is = socket.getInputStream();
DataInputStream dis = new DataInputStream(is);
while (true) {//循环接收信号
try {
String msg = dis.readUTF();
System.out.println(msg);
//把这个消息分发给全部客户端接收,包括自己
//sentMsgToAll(msg);
} catch (Exception e) {
System.out.println("自己下线了:"+socket.getRemoteSocketAddress());
//Server.onlinesockets.remove(socket);
dis.close();
socket.close();
break;
}
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
package Basic.src.com.IPDemo.TCPDemo.Demo04Forward;
import Basic.src.com.IPDemo.TCPDemo.Demo03.ServerReaderThread;
import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.CopyOnWriteArrayList;
public class Server {
public static List<Socket> onlinesockets = new CopyOnWriteArrayList<Socket>();
public static void main(String[] args) throws IOException {
System.out.println("=============服务端已开启============");
//1.创建ServerSocket对象,同时为服务端注册端口
ServerSocket serverSocket = new ServerSocket(8888);
//Socket socket = new Socket("127.0.0.1", 8888);
while (true) {//循环启动线程
//2.使用ServerSocket对象,调用一个accept方法,等待客户端的连接请求
Socket socket = serverSocket.accept();//启动后在此阻塞等待
//Socket socket = new ServerSocket(8888).accept();//启动后在此阻塞等待
//追踪客户端上线
onlinesockets.add(socket);//存入管道
System.out.println("有人上线了"+socket.getRemoteSocketAddress());
//3.把这个客户端对应的socket的通信管道交给一个独立的线程负责处理
new ServerReadThreads(socket).start();
}
}
}
package Basic.src.com.IPDemo.TCPDemo.Demo04Forward;
import java.io.*;
import java.net.Socket;
public class ServerReadThreads extends Thread {
private Socket socket;
public ServerReadThreads(Socket socket) {
this.socket = socket;
}
public void run() {
System.out.println("转发程序启动:"+socket.getRemoteSocketAddress());
try {
InputStream is = socket.getInputStream();
DataInputStream dis = new DataInputStream(is);
while (true) {//循环接收信号
try {
String msg = dis.readUTF();
System.out.println(msg);
//把这个消息分发给全部客户端接收,包括自己
sentMsgToAll(msg);
} catch (Exception e) {
System.out.println("有人下线了:"+socket.getRemoteSocketAddress());
Server.onlinesockets.remove(socket);
dis.close();
socket.close();
break;
}
}
} catch (IOException e) {
e.printStackTrace();
}
}
private void sentMsgToAll(String msg) throws Exception{
//发送给全部在线的socket接收
for (Socket onlinesocket : Server.onlinesockets){
System.out.println("开始转发消息,在线客户端数:" + Server.onlinesockets.size());
OutputStream os = onlinesocket.getOutputStream();
DataOutputStream dos = new DataOutputStream(os);
dos.writeUTF(msg);
dos.flush();
}
}
}
BS
http协议: http://服务器IP:服务器端口
package Basic.src.com.IPDemo.BSDemo;
import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;
public class Server {
public static void main(String[] args) throws Exception {
System.out.println("=============服务端已开启============");
//1.创建ServerSocket对象,同时为服务端注册端口
ServerSocket serverSocket = new ServerSocket(8080);
while (true) {
//2.使用ServerSocket对象,调用一个accept方法,等待客户端的连接请求
Socket socket = serverSocket.accept();
System.out.println("有人上线了:"+socket.getRemoteSocketAddress());
new ServerReaderThread(socket).start();
}
}
}
package Basic.src.com.IPDemo.BSDemo;
import java.io.DataOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.io.PrintStream;
import java.net.Socket;
public class ServerReaderThread extends Thread{
private Socket socket;
public ServerReaderThread(Socket socket) {
this.socket = socket;
}
@Override
public void run() {
//立即响应一个网页内容:“黑马程序员”给浏览器展示
OutputStream os = null;
try {
os = socket.getOutputStream();
PrintStream ps = new PrintStream(os);
ps.println("HTTP/1.1 200 OK");
ps.println("Content-Type: text/html; charset=UTF-8");
ps.println();
ps.println("<div style='color:red;font-size:140px;text-align:center;font-family:Arial'>密码的666<div style");
ps.close();
ps.close();
socket.close();//网页响应是短连接
} catch (IOException e) {
throw new RuntimeException(e);
}
}
}
package Basic.src.com.IPDemo.BSDemo;
import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;
public class Server {
public static void main(String[] args) throws Exception {
System.out.println("=============服务端已开启============");
//1.创建ServerSocket对象,同时为服务端注册端口
ServerSocket serverSocket = new ServerSocket(8080);
while (true) {
//2.使用ServerSocket对象,调用一个accept方法,等待客户端的连接请求
Socket socket = serverSocket.accept();
System.out.println("有人上线了:"+socket.getRemoteSocketAddress());
new ServerReaderThread(socket).start();
}
}
}
package Basic.src.com.IPDemo.BSDemo;
import java.io.DataOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.io.PrintStream;
import java.net.Socket;
public class ServerReaderThread extends Thread{
private Socket socket;
public ServerReaderThread(Socket socket) {
this.socket = socket;
}
@Override
public void run() {
//立即响应一个网页内容:“黑马程序员”给浏览器展示
OutputStream os = null;
try {
os = socket.getOutputStream();
PrintStream ps = new PrintStream(os);
ps.println("HTTP/1.1 200 OK");
ps.println("Content-Type: text/html; charset=UTF-8");
ps.println();
ps.println("<div style='color:red;font-size:140px;text-align:center;font-family:Arial'>密码的666<div style");
ps.close();
ps.close();
socket.close();//网页响应是短连接
} catch (IOException e) {
throw new RuntimeException(e);
}
}
}

浙公网安备 33010602011771号