昨天晚上转idea了,eclipse缓慢的更新过程和难以置信的插件安装速度我实在是忍不了了,找到idea破解方法安安心心用idea了
由于自己是刚刚接触线程,真就啥也不知道阿,话不多说先跑一个hello world再说
public class helloworld extends Thread{
public static void main(String[] args) {
new helloworld().start();
}
public void run(){
System.out.println("hello world!");
}
}
我们开始写聊天器吧
效果:
先确定下大致思路
服务器端在收到客户端的socket信号后保持运行状态,每一个客户端放在一个线程里面,并把客户端的socket收集起来
当收到一个客户端发送的信息后,利用socket和客户端一一对应的特点,将信息以流的方式传至其他客户端
客户端只要完成信息的输入和输出就可以了
所有的和socket有关信息传输大部分以流的方式传递
先写服务器端
Serve.java
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.ArrayList;
import java.util.List;
public class Serve extends Thread{
List<Socket> list=new ArrayList<>();//准备放置多个socket线程
ServerSocket serverSocket=null;//类内需要得到使用,不要在方法里面才声明,提前声明
public Serve(int port){
try {
serverSocket=new ServerSocket(port);//根据端口实例化,只有在同一个端口的线程才能并发
}catch (IOException e){
e.printStackTrace();
}
}
public void run(){
super.run();
try {
System.out.println("用户正在连接");
while (true){
Socket socket=serverSocket.accept();//利用accept方法阻塞线程,线程会等待socket的输入流
System.out.println("成功连接");//服务器显示已上线,即线程成功运行
SendMessUser("有人上线了");//向客户端发送上线信息
list.add(socket);//增加线程数量并记录
new ReadThread(socket).start();
}
}catch (IOException e){
e.printStackTrace();
}
}
public void SendMessUser(String message){//向其他客户发送数据
for(Socket socket:list){
if(socket!=null&&socket.isConnected()){//确保客户端没有掉线
try {
OutputStream outputStream=socket.getOutputStream();//输入与输出均要以流的方式进行
outputStream.write(message.getBytes());//输出流
outputStream.flush();//刷新
}catch (IOException e){
e.printStackTrace();
}
}
}
}
class ReadThread extends Thread{//读取数据
InputStream inputStream=null;
public ReadThread(Socket socket){
try {
inputStream=socket.getInputStream();//获取输入流
}catch (IOException e){
e.printStackTrace();
}
}
public void run(){
super.run();
try {
int len=0;
byte[] buf=new byte[1024];
while ((len=inputStream.read(buf))!=-1){
System.out.println("服务器监听"+new String(buf,0,len));//输入流的记录
SendMessUser(new String(buf,0,len));//将信息传致其他客户端
}
}catch (IOException e){
e.printStackTrace();
}
}
}
}
然后是客户端,神似服务器端
Client.java
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.Socket;
import java.net.UnknownHostException;
import java.util.Scanner;
public class Client extends Thread{
Socket socket=null;
public Client(String host,int port){
try {
socket=new Socket(host,port);
}catch (UnknownHostException e){
e.printStackTrace();
}catch (IOException e){
e.printStackTrace();
}
}
public void run(){
new WtiteMess().start();
super.run();
try {
InputStream inputStream=socket.getInputStream();//获取输入流
int len=0;
byte[] buf=new byte[1024];
while ((len=inputStream.read(buf))!=-1){
System.out.println(new String(buf,0,len));//格式化后输出
}
}catch (IOException e){
e.printStackTrace();
}
}
class WtiteMess extends Thread{
public void run(){
Scanner scanner=null;
OutputStream outputStream=null;
try {
scanner=new Scanner(System.in);//获取控制台输入
outputStream=socket.getOutputStream();//获取输出流
while (true){
String strs=scanner.next();
outputStream.write(strs.getBytes());//以输出流的方式输出
}
}catch (IOException e){
e.printStackTrace();
}
scanner.close();
try {
outputStream.close();
}catch (IOException e){
e.printStackTrace();
}
}
}
}
后面是两个启动文件
ServeTest.java
public class ServeTest {
public static void main(String[] args) {
Serve serve=new Serve(7777);
serve.run();
}
}
ClientTest
import java.util.Scanner;
public class ClientTest {
public static void main(String[] args) {
System.out.println("请输入你的ip地址作为用户名");
Scanner scanner=new Scanner(System.in);
String string=scanner.nextLine();
Client client=new Client(string,7777);
client.start();
}
}
2019-08-11