package socket;
import java.io.IOException;
import java.net.InetAddress;
import java.net.ServerSocket;
import java.net.Socket;
public class Demo {
public static void main(String[] args) throws IOException {
//用于服务端,指定服务端口号
ServerSocket serverSocket = new ServerSocket(8070);
//创建一个socket,()并连接到指定地址和端口号
Socket socket = new Socket("localhost",8070);
System.out.println("本机端口号:"+socket.getLocalPort());
System.out.println("本机地址:"+socket.getLocalAddress());
System.out.println("本地主机:"+InetAddress.getLocalHost());
System.out.println("socket连接到的远程端口:"+socket.getPort());
InetAddress add = socket.getLocalAddress();
System.out.println("socket绑定的本地地址"+add);
System.out.println("socket连接的地址"+socket.getInetAddress());
}
}
package 聊天室;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
public class Server {
//创建一个serversocket服务端
private ServerSocket ss;
//定义一个集合allOut用于存储所有的输出流
//存储所有与客户端的通信
private List<PrintWriter> allOut;
private ExecutorService threadPoll;
//构造方法,给serversocket赋值
public Server(){
try {
ss = new ServerSocket(8080);
//创建集合allOut
allOut=new ArrayList<PrintWriter>();
threadPoll = Executors.newFixedThreadPool(10);
} catch (IOException e) {
e.printStackTrace();
}
}
private class Handler implements Runnable{
private Socket socket;
public Handler(Socket socket){
this.socket=socket;
}
@Override
public void run() {
PrintWriter pw=null;
try{
//得到当前Socket的输出流
OutputStream os=socket.getOutputStream();
pw=new PrintWriter(new OutputStreamWriter(os,"UTF-8"),true);
//将流加入都集合中allOut
addOut(pw);
//获取远端IP
String name=socket.getInetAddress().getHostName();
pw.println("欢迎"+name+"连接聊天室");
//建立输入流
InputStream in=socket.getInputStream();
BufferedReader br=
new BufferedReader(
new InputStreamReader(in,"UTF-8"));
//读取信息
/*
* 遍历集合allOut,将读取的信息依次
* 通过输出流发送给各个客户端
*/
String message = null;
while ((message=br.readLine())!=null) {
sendMessage(name+"说:"+message);
}
}catch(Exception e){
System.out.println("通讯失败");
e.printStackTrace();
}finally{
//客户端断开连接,删除它的输出流
//allOut.remove(pw); 需要同步
removeOut(pw);
if(socket!=null){
try {
socket.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
/**
* sendMessage方法,遍历allOut集合
*/
private synchronized void sendMessage(String message){
for(PrintWriter pw:allOut){
pw.println(message);
}
}
/**
* 定义removeOut方法
* 从allOut方法中删除输出流
* @param pw 当前线程的输出流
*/
private synchronized void removeOut(PrintWriter pw){
allOut.remove(pw);
}
/**
* addOut方法,向allOut中添加输出流元素
* 保证同步安全,与删除和遍历互斥
*/
private synchronized void addOut(PrintWriter pw){
allOut.add(pw);
}
}
//开启服务端
public void start(){
//监听客户端连接,客户端都会产生一个socket实例,这个socket代表两者的连接
try {
System.out.println("等待客户端连接");
while(true){
//监听客户端连接,到这里会堵塞,直到成功连接到一个客户端socket
Socket socket=ss.accept();
System.out.println("客户端已连接!");
Handler handler=new Handler(socket);
// Thread thread=new Thread(handler);
// thread.start();
threadPoll.execute(handler);
}
} catch (IOException e) {
System.out.println("连接客户端失败");
e.printStackTrace();
}
}
public static void main(String[] args) {
//创建一个服务器对象
Server server=new Server();
//开启服务器
server.start();
}
}
package 聊天室;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.net.Socket;
import java.util.Scanner;
public class Client01 {
//客户端
private Socket socket;
//构造方法,初始化
public Client01(){
try {
// socket = new Socket("localhost", 8080);
// socket = new Socket("192.168.1.9", 8088);
socket = new Socket("192.168.0.154", 8088);
// socket = new Socket("172.19.230.17", 8080);
} catch (Exception e) {
System.out.println("连接服务器失败");
}
}
/*
* 客户端的工作方法
*/
public void start(){
Thread inputThread = new Thread(new Runnable() {
@Override
public void run() {
InputStream is = null;
try {
is = socket.getInputStream();
BufferedReader br=
new BufferedReader(
new InputStreamReader(is,"UTF-8"));
String message = null;
while ((message=br.readLine())!=null) {
System.out.println(message);
}
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
});
inputThread.setDaemon(true);
inputThread.start();
try {
OutputStream os=socket.getOutputStream();
PrintWriter pw=new PrintWriter(
new OutputStreamWriter(os,"UTF-8"),true);
Scanner scan=new Scanner(System.in);
String name=socket.getInetAddress().getHostName();
while (true) {
// System.out.println("我说:");
String s = scan.nextLine();
if (s.equals("quit")) {
break;
}
pw.println("lll:"+s);
}
} catch (Exception e) {
//通讯失败
System.out.println("通信失败");
e.printStackTrace();
}finally{
//关闭连接
try {
socket.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
//测试连接
public static void main(String[] args) {
Client01 client = new Client01();
client.start();
}
}