Socket(套接字):用于描述IP地址和端口,每个服务软件都打开了一个Socket,并绑定到一个端口上。Socket和ServerSocket(用于服务器)类位于java.net包
获取本地地址和端口号:int getLocalPort();String getHostAddress();InetAddress getLocalAddress();
获取网络输入输出流:
Socket相当于一个邮箱,pw.println();把信放到邮箱;br.readLine();从邮箱拿信;
使用Socket完毕后使用void close()方法关闭(会同时关闭输入输出流)
服务器端(Server):创建监听服务-->等待连接--->进行通讯--->关闭连接
public class Server{
private ServerSocket server;
private List<PrintWriter> allOut;
public Server(){
try{
allOut = new ArrayList<PrintWriter>();
server = new ServerSocket(8088);
}catch(Exception e){
e.printStackTrace();
}
}
private synchronized void addOut(PrintWriter pw){
allOut.add(pw);
}
private synchronized void removeOut(PrintWriter pw){
allOut.remove(pw);
}
private synchronized void sendMessageToAllClient(String message){
for(PrintWriter pw:allOut){
pw.println(message);
}
}
public void start(){
try{
while(true){
System.out.println("等待客户端连接....");
Socket socket = server.accept();
ClientHandle clientHandle = new ClientHandle(socket);
Thread t = new Thread(clientHandle);
t.start();
}
}catch(Exception e){
e.printStackTrace();
}
}
public static void main(String[] args){
Server server = new Server();
server.start();
}
private class ClientHandle implements Runnable{
private Socket socket;
private String host;
public ClientHandle(Socket socket){
this.socket=socket;
InetAddress address = socket.getInetAddress();
host = address.getHostAddress();
System.out.println(host+"上线了");
}
public void run(){
PrintWriter pw = null;
try{
OutputStream out = socket.getOutputStream();
OutputStreamWriter osw = new OutputStreamWriter(out,"utf-8");
pw = new PrintWriter(osw,true);
addOut(pw);
InputStream in = socket.getInputStream();
InputStreamReader isr = new InputStreamReader(in,"utf-8");
BufferedReader br = new BufferedReader(isr);
String s = null;
while((s=br.readLine())!=null){
System.out.println(host+"说:"+s);
}
}catch(Exception e){
e.printStackTrace();
}finally{
try{
removeOut(pw);
socket.close();
System.out.println(host+"下线了!");
}catch(IOException e){
e.printStackTrace();
}
}
}
}
}
客户端(Client):连接服务器-->进行通讯-->关闭连接
public class Client{
private Socket socket = new Socket();
public Client(){
try{
socket = new Socket("127.0.0.1",8088);
}catch(Exception e){
e.printStackTrace();
}
}
public void start(){
try{
ServerMessage message = new ServerMessage();
Thread t = new Thread(message);
t.start();
OutputStream out = socket.getOutputStream();
OutputStreamWriter osw = new OutputStreamWriter(out,"utf-8");
PrintWriter pw = new PrintWriter(osw,true);
pw.println("服务端你好!");
Scanner sc = new Scanner(System.in);
while(true){
pw.println(sc.nextLine());
}
}catch(Exception e){
e.printStackTrace();
}
}
public static void main(String[] args){
Client client = new Client();
client.start();
}
private class ServerMessage implements Runnable{
public void run(){
try{
InputStream in = socket.getInputStream();
InputStreamReader isr = new InputStreamReader(in,"utf-8");
BufferedReader br = new BufferedReader(isr);
String s = null;
while((s=br.readLine())!=null){
System.out.println("服务器说"+s);
}
}catch(IOException e){
e.printStackTrace();
}
}
}
}
获取本地地址和端口号:int getLocalPort();String getHostAddress();InetAddress getLocalAddress();
获取网络输入输出流:
Socket相当于一个邮箱,pw.println();把信放到邮箱;br.readLine();从邮箱拿信;
使用Socket完毕后使用void close()方法关闭(会同时关闭输入输出流)
服务器端(Server):创建监听服务-->等待连接--->进行通讯--->关闭连接
public class Server{
private ServerSocket server;
private List<PrintWriter> allOut;
public Server(){
try{
allOut = new ArrayList<PrintWriter>();
server = new ServerSocket(8088);
}catch(Exception e){
e.printStackTrace();
}
}
private synchronized void addOut(PrintWriter pw){
allOut.add(pw);
}
private synchronized void removeOut(PrintWriter pw){
allOut.remove(pw);
}
private synchronized void sendMessageToAllClient(String message){
for(PrintWriter pw:allOut){
pw.println(message);
}
}
public void start(){
try{
while(true){
System.out.println("等待客户端连接....");
Socket socket = server.accept();
ClientHandle clientHandle = new ClientHandle(socket);
Thread t = new Thread(clientHandle);
t.start();
}
}catch(Exception e){
e.printStackTrace();
}
}
public static void main(String[] args){
Server server = new Server();
server.start();
}
private class ClientHandle implements Runnable{
private Socket socket;
private String host;
public ClientHandle(Socket socket){
this.socket=socket;
InetAddress address = socket.getInetAddress();
host = address.getHostAddress();
System.out.println(host+"上线了");
}
public void run(){
PrintWriter pw = null;
try{
OutputStream out = socket.getOutputStream();
OutputStreamWriter osw = new OutputStreamWriter(out,"utf-8");
pw = new PrintWriter(osw,true);
addOut(pw);
InputStream in = socket.getInputStream();
InputStreamReader isr = new InputStreamReader(in,"utf-8");
BufferedReader br = new BufferedReader(isr);
String s = null;
while((s=br.readLine())!=null){
System.out.println(host+"说:"+s);
}
}catch(Exception e){
e.printStackTrace();
}finally{
try{
removeOut(pw);
socket.close();
System.out.println(host+"下线了!");
}catch(IOException e){
e.printStackTrace();
}
}
}
}
}
客户端(Client):连接服务器-->进行通讯-->关闭连接
public class Client{
private Socket socket = new Socket();
public Client(){
try{
socket = new Socket("127.0.0.1",8088);
}catch(Exception e){
e.printStackTrace();
}
}
public void start(){
try{
ServerMessage message = new ServerMessage();
Thread t = new Thread(message);
t.start();
OutputStream out = socket.getOutputStream();
OutputStreamWriter osw = new OutputStreamWriter(out,"utf-8");
PrintWriter pw = new PrintWriter(osw,true);
pw.println("服务端你好!");
Scanner sc = new Scanner(System.in);
while(true){
pw.println(sc.nextLine());
}
}catch(Exception e){
e.printStackTrace();
}
}
public static void main(String[] args){
Client client = new Client();
client.start();
}
private class ServerMessage implements Runnable{
public void run(){
try{
InputStream in = socket.getInputStream();
InputStreamReader isr = new InputStreamReader(in,"utf-8");
BufferedReader br = new BufferedReader(isr);
String s = null;
while((s=br.readLine())!=null){
System.out.println("服务器说"+s);
}
}catch(IOException e){
e.printStackTrace();
}
}
}
}