자바 간단 한 랜 채 팅 실현
자바 의 Socket 프로 그래 밍:
1.TCP 프로 토 콜 은 연결 되 고 신뢰 할 수 있 으 며 질서 가 있 으 며 바이트 흐름 으로 데 이 터 를 보 내 고 세 번 의 악수 방식 으로 연결 을 구축 하여 데 이 터 를 전송 하 는 통 로 를 형성 하 며 연결 에서 대량의 데 이 터 를 전송 하면 효율 이 약간 떨어진다.
2.자바 에서 TCP 프로 토 콜 을 바탕 으로 네트워크 통신 을 실현 하 는 클래스
클 라 이언 트 의 Socket 류서버 쪽 의 ServerSocket 류
3.Socket 통신 의 절차
① ServerSocket 과 Socket 만 들 기
② Socket 에 연 결 된 입 출력 흐름 열기
③ 협의 에 따라 Socket 에 대해 읽 기/쓰기 작업 을 한다.
④ 입 출력 흐름 닫 기,소켓 닫 기
4.서버 쪽:
① ServerSocket 대상 을 만 들 고 감청 포트 를 연결 합 니 다.
② accept()방법 으로 클 라 이언 트 요청 을 감청
③ 연결 이 이 루어 진 후 입력 흐름 을 통 해 클 라 이언 트 가 보 낸 요청 정 보 를 읽 습 니 다.
④ 수출 흐름 을 통 해 클 라 이언 트 에 게 향 음 정 보 를 보낸다.
⑤ 관련 자원 닫 기
5.클 라 이언 트:
① 소켓 대상 을 만 들 고 연결 할 서버 의 주소 와 포트 번 호 를 표시 합 니 다.
② 연결 후 출력 스 트림 을 통 해 서버 측 에 요청 메 시 지 를 보 냅 니 다.
③ 입력 흐름 을 통 해 서버 응답 정 보 를 가 져 옵 니 다.
④ 응답 자원 닫 기
실 현 된 채 팅 방 예:
실현 효 과 는 다음 과 같다.
서버 코드:
package socket.server;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.ArrayList;
/**
* @author
* Create by fengc on 2018/7/25 21:21
*/
public class Server extends Thread{
ServerUI ui;
ServerSocket ss;
BufferedReader reader;
PrintWriter writer;
public Server(ServerUI ui) {
this.ui = ui;
this.start();
}
@Override
public void run() {
try {
ss = new ServerSocket(8081);
ui.clients=new ArrayList<>();
println(" : 8081");
while (true) {
println(" .......................................");
Socket client = ss.accept();
ui.clients.add(client);
println(" , :" + client.toString());
new ListenerClient(ui, client);
}
} catch (IOException e) {
println(" : 8081");
println(e.toString());
e.printStackTrace();
}
}
public synchronized void sendMsg(String msg) {
try {
for (int i = 0; i < ui.clients.size(); i++) {
Socket client = ui.clients.get(i);
writer = new PrintWriter(client.getOutputStream(), true);
writer.println(msg);
}
} catch (Exception e) {
println(e.toString());
}
}
public void println(String s) {
if (s != null) {
s = " :" + s;
this.ui.taShow.setText(this.ui.taShow.getText() + s + "
");
System.out.println(s + "
");
}
}
public void closeServer() {
try {
if (ss != null)
ss.close();
if (reader != null)
reader.close();
if (writer != null)
writer.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
package socket.server;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.Socket;
/**
* @author
* Create by fengc on 2018/7/25 21:33
* *
*/
public class ListenerClient extends Thread{
BufferedReader reader;
PrintWriter writer;
ServerUI ui;
Socket client;
public ListenerClient(ServerUI ui, Socket client) {
this.ui = ui;
this.client=client;
this.start();
}
// ,
@Override
public void run() {
String msg = "";
while (true) {
try {
reader = new BufferedReader(new InputStreamReader(client.getInputStream()));
writer = new PrintWriter(client.getOutputStream(), true);
msg = reader.readLine();
sendMsg(msg);
} catch (IOException e) {
println(e.toString());
break;
}
if (msg != null && msg.trim() != "") {
println(" " + msg);
}
}
}
//
public synchronized void sendMsg(String msg) {
try {
for (int i = 0; i < ui.clients.size(); i++) {
Socket client = ui.clients.get(i);
writer = new PrintWriter(client.getOutputStream(), true);
writer.println(msg);
}
} catch (Exception e) {
println(e.toString());
}
}
public void println(String s) {
if (s != null) {
this.ui.taShow.setText(this.ui.taShow.getText() + s + "
");
System.out.println(s + "
");
}
}
}
package socket.server;
import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.net.Socket;
import java.util.List;
/**
* @author
* Create by fengc on 2018/7/25 21:21
*/
public class ServerUI extends JFrame {
public static void main(String[] args) {
new ServerUI();
}
public JButton btStart;//
public JButton btSend;//
public JTextField tfSend;//
public JTextArea taShow;//
public Server server;//
static List<Socket> clients;//
public ServerUI() {
super(" ");
btStart = new JButton(" ");
btSend = new JButton(" ");
tfSend = new JTextField(10); //
taShow = new JTextArea();
// , ,
btStart.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
server = new Server(ServerUI.this);
}
});
//
btSend.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
server.sendMsg(tfSend.getText());
tfSend.setText("");
}
});
//
this.addWindowListener(new WindowAdapter() {
//
public void windowClosing(WindowEvent e) {
int a = JOptionPane.showConfirmDialog(null, " ?", " ",
JOptionPane.YES_NO_OPTION);
if (a == 1) {
server.closeServer();
System.exit(0); //
}
}
});
//
JPanel top = new JPanel(new FlowLayout());
top.add(tfSend);
top.add(btSend);
top.add(btStart);
this.add(top, BorderLayout.SOUTH);
//
final JScrollPane sp = new JScrollPane();
sp.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_ALWAYS);
sp.setViewportView(this.taShow);
this.taShow.setEditable(false);
this.add(sp, BorderLayout.CENTER);
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
this.setSize(400, 300);
this.setLocation(100, 200);
this.setVisible(true);
}
}
클 라 이언 트 코드:
package socket.clinet;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.Socket;
/**
* @author
* Create by fengc on 2018/7/25 21:41
*/
public class Client extends Thread {
ClientUI ui;
Socket client;
BufferedReader reader;
PrintWriter writer;
public Client(ClientUI ui) {
this.ui = ui;
try {
String ip = ui.tfIP.getText(); // ip
int port = Integer.parseInt(ui.tfPort.getText()); //
client = new Socket(ip, port);// IP
println(" , :" + port);
reader = new BufferedReader(new InputStreamReader(client.getInputStream()));
writer = new PrintWriter(client.getOutputStream(), true);
String name = ui.tfName.getText();
if (name == null || "".equals(name)) {
name = " ";
}
sendMsg(" " + name + ", ........................");
// true, println、printf format
} catch (NumberFormatException nu) {
println(" .......");
nu.printStackTrace();
} catch (IOException e) {
println(" : IP ");
println(e.toString());
e.printStackTrace();
}
this.start();
}
public void run() {
String msg = "";
while (true) {
try {
msg = reader.readLine();
} catch (IOException e) {
println(" ");
break;
}
if (msg != null && msg.trim() != "") {
println(msg);
}
}
}
public void sendMsg(String msg) {
try {
writer.println(msg);
} catch (Exception e) {
println(e.toString());
}
}
public void println(String s) {
if (s != null) {
this.ui.taShow.setText(this.ui.taShow.getText() + s + "
");
System.out.println(s + "
");
}
}
}
package socket.clinet;
import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
/**
* @author
* Create by fengc on 2018/7/25 21:40
*/
public class ClientUI extends JFrame {
public static void main(String[] args) {
new ClientUI();
}
public JButton btStart;
public JButton btSend;
public JTextField tfSend; //
public JTextPane nameText; //
public JTextPane ipTex; //
public JTextPane portText; //
public JTextField tfName; // ip
public JTextField tfIP; // ip
public JTextField tfPort; //
public JTextArea taShow;
public Client server;
public ClientUI() {
super(" ");
btStart = new JButton(" ");
btSend = new JButton(" ");
tfSend = new JTextField(20);
tfIP = new JTextField(8);
tfPort = new JTextField(3);
tfName = new JTextField(6);
nameText = new JTextPane();nameText.setText(" ");nameText.setEditable(false);
ipTex = new JTextPane();ipTex.setText(" ");ipTex.setEditable(false);
portText = new JTextPane();portText.setText(" ");portText.setEditable(false);
taShow = new JTextArea();
//
btStart.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
server = new Client(ClientUI.this);
}
});
//
btSend.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
String name = tfName.getText();
if (name == null || "".equals(name)) {
name = " ";
}
server.sendMsg(name + ":" + tfSend.getText());
tfSend.setText("");
}
});
this.addWindowListener(new WindowAdapter() {
public void windowClosing(WindowEvent e) {
int a = JOptionPane.showConfirmDialog(null, " ?", " ",
JOptionPane.YES_NO_OPTION);
if (a == 1) {
System.exit(0); //
}
}
});
//
JPanel top = new JPanel(new FlowLayout());
top.add(tfSend); //
top.add(btSend); //
this.add(top, BorderLayout.SOUTH); //
//
JPanel northJpannel = new JPanel(new FlowLayout());
northJpannel.add(nameText);
northJpannel.add(tfName);
northJpannel.add(ipTex);
northJpannel.add(tfIP);
northJpannel.add(portText);
northJpannel.add(tfPort);
northJpannel.add(btStart);
this.add(northJpannel,BorderLayout.NORTH); //
final JScrollPane sp = new JScrollPane();
sp.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_ALWAYS);
sp.setViewportView(this.taShow);
this.taShow.setEditable(false);
this.add(sp, BorderLayout.CENTER);
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
this.setSize(500, 400);
this.setLocation(600, 200);
this.setVisible(true);
}
}
이상 이 바로 본 고의 모든 내용 입 니 다.여러분 의 학습 에 도움 이 되 고 저 희 를 많이 응원 해 주 셨 으 면 좋 겠 습 니 다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Is Eclipse IDE dying?In 2014 the Eclipse IDE is the leading development environment for Java with a market share of approximately 65%. but ac...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.