###线程(Tread)
cpu---同一时候只能处理一个事情;
中断响应---中止当前进程,进行优先级更高的进程;
阻塞---io事件的输入与输出
多线程---最大程度利用cpu时间片;
implements(实线) InterruptedException(接口)---规定了必须实现的方法
String[] a = b.split("\r\n")---字符串拆分
Thread.sleep(3000);---3秒等待时间
static class Thread.State
线程状态。
public class serverDemo implements Runnable---组方法+implements Runnable
线程使用方法(Tread)
package com.mtlk.会话;
public class 线程操作 implements Runnable{
private final String mes; //不可修改的私有全局变量
public 线程操作(String mes){
this.mes = mes; //定义一个全局变量
}
public static void main(String[] args)throws InterruptedException { //主方法,使用多线程
线程操作 ta = new 线程方法("this is Thread_A"); //线程一
new Thread(ta).start();
线程操作 td = new 线程方法("this is Thread_B"); //线程二
new Thread(td).start();
}
@Override
public void run() {
for (int i=0;i<10;i++){ //循环规则
System.out.println(Thread.currentThread().getName()); //打印当前线程
System.out.println(mes); //同时输出两个线程到控制台
try {
Thread.sleep(3000); //每次输出相隔3秒
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
PrintWrite
void println(String x)
打印 String,然后终止该行。
PrintWriter(Writer out)
创建不带自动行刷新的新 PrintWriter。
###ServerSocket
ServerScoket---服务器
ServerSocket(int port)
创建绑定到特定端口的服务器套接字。
socket()
通过系统默认类型的 SocketImpl 创建未连接套接字
Socket accept()
侦听并接受到此套接字的连接。
void print(String s)
打印字符串。
.hasNextLine()---判断是否有下一行
.nextLine()---扫描一行
S
server服务器端
package com.mtlk.会话;
import java.io.IOException;
import java.io.InputStream;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.Scanner;
public class server implements Runnable{
private ServerSocket ss; //设置全局变量
private Socket s;
public server() throws IOException{ //构造方法
ss = new ServerSocket(1314); //设置端口
s = ss.accept(); //侦听并接受此端口收到的消息
new Thread(this).start(); //线程状态,开启
receive(); //调用下面的方法
}
private void receive() throws IOException{
Scanner sc = new Scanner(System.in); //输入到文本框的内容
PrintWriter pw = new PrintWriter(s.getOutputStream()); //端口接收的内容做高级封装
while (true){ //开启循环
String mes = sc.next(); //控制台输入的内容转化为字符串
if (mes.equalsIgnoreCase("end")){ //控制输入end
System.out.println("退出会话"); //如果输入end那么控制台输出退出会话
return; //退出此次会话
}else {
pw.println(mes); //将控制台内容输出
pw.flush(); //输出
}
}
}
@Override
public void run() {
try {
InputStream is = s.getInputStream(); //获取输入到端口的内容
Scanner sc = new Scanner(is); //将端口的内容输入到控制台
while (true){
if (sc.hasNextLine()) { //扫描输入内容是否有下一行
System.out.println("Client:" + sc.nextLine()); //如果有下一行那么输出到控制台
}
}
} catch (IOException e) {
e.printStackTrace();
}
}
public static void main(String[] args) throws IOException {
new server(); //运行整个程序
}
}
client客户端
package com.mtlk.会话;
import java.io.IOException;
import java.io.InputStream;
import java.io.PrintWriter;
import java.net.Socket;
import java.util.Scanner;
public class client implements Runnable{
private Socket s; //定义全局变量
public client() throws IOException {
s = new Socket("127.0.0.1",8000); //设置目的ip,和端口
new Thread(this).start(); //开启线程
receive();
}
private void receive() throws IOException {
Scanner sc = new Scanner(System.in); //输入到控制台
PrintWriter pw = new PrintWriter(s.getOutputStream()); //获取输入到端口的消息
while(true){
String mes = sc.next(); //控制台输入内容转化为字符串
if(mes.equalsIgnoreCase("end")){ //判断输入内容是不是end
System.out.println("系统退出"); //符合条件,就输出这个内容
return;
}
pw.println(mes); //将端口消息写入控制台
pw.flush(); //刷新
}
}
@Override
public void run() {
try {
InputStream is = s.getInputStream(); //获取端口收到消息
Scanner sc = new Scanner(is); //输入到控制台
while(true){
if(sc.hasNextLine()) { //查看输入内容是否有下一行
System.out.println("Server: " + sc.nextLine()); //输出端口收到的消息
}
}
} catch (IOException e) {
e.printStackTrace();
}
}
public static void main(String[] args) throws IOException {
new client(); //执行程序
}
}
List
List list = Arrays.asList(s)---集合框架,可扩展集合
void add(String item)
向滚动列表的末尾添加指定的项。
TCP协议单线程通信
Server package com.mtlk.会话;
import java.io.IOException;
import java.io.InputStream;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.Scanner;
public class 服务器_1 {
public static void main(String[] args) throws IOException {
ServerSocket ss =new ServerSocket(9000); //创建目标端口
Socket s = ss.accept(); //获取端口收到的信息
InputStream i = s.getInputStream(); //将端口收到的信息输入
Scanner o = new Scanner(i); //将端口获取的信息输入控制台
while (o.hasNextLine()){ //扫描是否有下一行
System.out.println("客户端:"+o.nextLine()); //一行一行打印
}
}
}
客户端 package com.mtlk.会话;
import java.io.IOException;
import java.io.PrintWriter;
import java.net.Socket;
import java.util.Scanner;
public class 客户端_1 {
public static void main(String[] args) throws IOException {
Socket socket = new Socket("127.0.0.1",9000); //目标网址,端口
// String mes = "Hello"; //要传输的内容
Scanner sa = new Scanner(System.in);
String name = sa.next(); //控制台输入内容
PrintWriter pw = new PrintWriter(socket.getOutputStream()); //创建一个传输的文件
pw.print(name); //将传输的内容放入传输文件中
pw.flush(); //刷新
}
}
UDP单线程通信
DatagramPacket(byte[] buf, int length)
构造 DatagramPacket,用来接收长度为 length 的数据包。
DatagramSocket()
构造数据报套接字并将其绑定到本地主机上任何可用的端口。
void receive(DatagramPacket p)
从此套接字接收数据报包。
void send(DatagramPacket p)
从此套接字发送数据报包。
byte[] getData()
返回数据缓冲区。
服务器
package com.mtlk.会话;
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
public class UDP服务器 {
public static void main(String[] args)throws IOException {
byte[] buffer = new byte[1024]; //新建一个比特数组
DatagramSocket ds = new DatagramSocket(7000); //规定端口
DatagramPacket da = new DatagramPacket(buffer,buffer.length); //建立缓存空间和缓存长度
ds.receive(da); //将端口获取的数据存入数据缓存区
System.out.println(da.getAddress().getHostAddress()); //获取对面ip地址
System.out.println(da.getPort()); //获取对方端口号
byte[]context = da.getData(); //将缓存区数据存入比特数组
System.out.println(new String(context)); //转化为字符串输出到控制台
}
}
客户端 package com.mtlk.会话;
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
public class UDP客户端 {
public static void main(String[] args)throws IOException {
byte[] context = "Hello Server".getBytes(); //将输入内容转化为比特流,存入比特数组
DatagramSocket ds = new DatagramSocket(); //实例化套接字,随机端口
DatagramPacket dp = new DatagramPacket(context,context.length, InetAddress.getByName("255.255.255.255"),7000); //广播发送,设置目的端口
ds.send(dp); //随机端口发送数据包,内容为dp
}
}