當前位置:首頁 » 操作系統 » c聊天室源碼

c聊天室源碼

發布時間: 2022-08-01 15:04:21

❶ 你好,你有用java編寫的聊天室的代碼嗎,基於c/s架構的

服務端 用戶名 y 密碼 1 客戶端代碼在我的評論里,這敲不了那麼多字,沒辦法。

登陸實現類:class Login
package com.server;

import java.awt.Color;
import java.awt.Font;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPasswordField;
import javax.swing.JTextField;

public class Login {
boolean f=false;//按登錄時設置的一個標志
private JFrame frame = new JFrame("Welcome To MLDN") ;
//設置窗體
private JButton submit = new JButton("登陸");//設置登錄按鈕
private JButton reset = new JButton("重置");//設置重置按鈕
private JLabel nameLab = new JLabel("伺服器:") ;//標簽實例化
private JLabel passLab = new JLabel("密 碼:"); //標簽實例化
private JLabel infoLab = new JLabel("伺服器登陸系統"); //標簽實例化
private JTextField nameText = new JTextField(10);//單行文本輸入條
private JPasswordField passText = new JPasswordField() ;//單行密碼文本輸入條
public Login(){//登錄窗口構造方法
Font fnt = new Font("Serief",Font.ITALIC + Font.BOLD,12); //設置字體
infoLab.setFont(fnt) ; // 設置標簽的顯示文字
submit.addActionListener(new ActionListener(){ //採用內部匿名類
public void actionPerformed(ActionEvent e){
if(e.getSource()==submit){ //判斷觸發器源是否是提交按鈕
String tname = nameText.getText() ; //得到輸入的用戶名
String tpass = new String(passText.getPassword()) ;//得到輸入的密碼,此時通過getPassageword()方法返回的是字元數組
LoginCheck log = new LoginCheck(tname,tpass) ;//實例化LoginCheck對象,傳入輸入的用戶名和密碼
if(log.validate()){//對用戶名和密碼進行驗證
try{ //線程異常處理try
Thread.sleep(2000); //2秒後打開聊天窗口
f=true; //登錄成功後的表示項為true
frame.dispose(); //關閉本窗口
}catch(Exception e1){//異常獲取
e1.printStackTrace();
}
}else{
infoLab.setText("登陸失敗,錯誤的用戶名或密碼!") ;//登錄失敗
}
}
}
});

reset.addActionListener(new ActionListener(){ //採用內部匿名類
public void actionPerformed(ActionEvent e){
if(e.getSource()==reset){ //判斷觸發器源是否是提交按鈕
nameText.setText(""); //設置文本框中的內容
passText.setText(""); //設置文本框中的內容
infoLab.setText("伺服器登陸系統"); //恢復標簽顯示
}
}
});
frame.addWindowListener(new WindowAdapter(){//加入窗口監聽
public void windowClosing(WindowEvent e){ }
}); // 加入事件
frame.setLayout(null); //使用絕對定位
nameLab.setBounds(5,5,60,20); //設置標簽的位置及大小
passLab.setBounds(5,30,60,20); //設置標簽的位置及大小
infoLab.setBounds(5,65,220,30); //設置標簽的位置及大小
nameText.setBounds(65,5,100,20); //設置文本域的位置及大小
passText.setBounds(65,30,100,20); //設置密碼域的位置及大小
submit.setBounds(165,5,60,20); //設置按鈕的位置及大小
reset.setBounds(165,30,60,20); //設置按鈕的位置及大小
frame.add(nameLab); //向窗體加入標簽
frame.add(passLab); //向窗體加入標簽
frame.add(infoLab); //向窗體加入標簽
frame.add(nameText); //向窗體加入文本框
frame.add(passText); //向窗體加入密碼框
frame.add(submit); //向窗體加入按鈕
frame.add(reset) ;//向窗體加入按鈕
frame.setSize(280,130); //設置窗體大小
frame.getContentPane().setBackground(Color.green) ;//設置窗體的背景顏色
frame.setLocation(300,200) ;//設置窗體在電腦桌面上的位置
frame.setVisible(true); //顯示窗口
while(f==false){ //當登錄失敗時,一直循環運行,
}
new MyServer();//顯示窗體頁面
}
}

驗證登陸實現類 class LoginCheck
package com.server;

public class LoginCheck {
private String name ;//用戶名
private String password ;//密碼
//構造方法
public LoginCheck(String name,String password){
this.name = name ;//傳遞用戶名
this.password = password ;//傳遞密碼
}
//驗證用戶名和密碼
public boolean validate(){
//驗證方法
if("y".equals(name)&&"1".equals(password)){ //判斷用戶名和密碼是否正確
return true; //返回true
}else{
return false ;//返回false
}
}
}

package com.server;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;
import java.text.DateFormat;
import java.util.Date;
import javax.swing.*;

聊天實現類 class MyServer
public class MyServer {
protected JLabel lab10;
// 全體變數,做傳遞的一個組件
String s = "已經成功連接";

// 初始字元串,在兩個聊天窗口鏈接成功時輸出,同時作為兩個窗口傳遞字元的一個變數
// 構造方法
public MyServer(){
try{//異常處理
JFrame frame=new JFrame("伺服器窗口");
//設置窗體
frame.setLayout(null);
//讓布局管理器為空,使用絕對定位
Font fnt=new Font("Serief",Font.PLAIN,40);//字體設置
Font fnt1=new Font("Serief",Font.PLAIN,20);//字體設置
//我的用戶名顯示
JLabel lab1=new JLabel("伺服器名:",JLabel.LEFT);
//標簽實例化,文本左對齊
lab1.setBounds(8, 10, 100, 20);
//設置組件位置及大小
frame.add(lab1);
//添加組件
JTextField text2=new JTextField(30); //單行文本輸入組件
text2.setBounds(150, 10, 200, 20);//設置組件位置及大小
text2.setEnabled(false);//文本條不可編輯
text2.setText("笑笑聊天室");//輸入內容
text2.setFont(fnt1);//設置字體
frame.add(text2);//添加組件
//伺服器IP顯示
JLabel lab2=new JLabel("當前伺服器IP:",JLabel.LEFT);
//標簽實例化,文本左對齊
lab2.setBounds(8, 45, 100, 20);//設置組件位置及大小
frame.add(lab2);//添加組件
JTextField text3=new JTextField(30);//單行文本輸入組件
text3.setBounds(150, 45, 200, 20);//設置組件位置及大小
text3.setEnabled(false);
//文本不可編輯
text3.setText("127.0.0.1");//輸入內容
text3.setFont(fnt1);//設置字體
frame.add(text3);
//添加組件
//伺服器埠顯示
JLabel lab3=new JLabel("當前伺服器埠:",JLabel.LEFT);
//標簽實例化,文本左對齊
lab3.setBounds(8, 80, 100, 20);//設置組件位置及大小
frame.add(lab3);//添加組件
JTextField text4=new JTextField(30);//單行文本輸入組件
text4.setBounds(150, 80, 200, 20);//設置組件位置及大小
text4.setEnabled(false);//文本不可編輯
text4.setText("8888");//輸入內容
text4.setFont(fnt1);//設置字體
frame.add(text4);//添加組件
//聊天記錄顯示
JLabel lab4=new JLabel("聊天記錄如下:",JLabel.LEFT);
//標簽實例化 文本左對齊
lab4.setBounds(8, 115, 100, 20);//設置組件位置及大小
frame.add(lab4);//添加組件
final JTextArea text1=new JTextArea();//多行文本輸入組件
text1.setEnabled(false);//文本不可編輯
text1.setLineWrap(true);//自動換行
JScrollPane scr=new JScrollPane(text1,JScrollPane.VERTICAL_SCROLLBAR_ALWAYS,JScrollPane.HORIZONTAL_SCROLLBAR_ALWAYS); //設置滾動條,水平和垂直滾動條始終顯示
scr.setBounds(8, 150, 450, 350);//設置組件位置及大小
frame.add(scr);//添加組件
//聊天輸入窗口及確定
JLabel lab5=new JLabel("請輸入聊天內容:",JLabel.LEFT); //標簽實例化,文本左對齊
lab5.setBounds(8, 500, 100, 20);//設置組件位置及大小
frame.add(lab5);//添加組件
final JTextArea text5=new JTextArea();//多行文本輸入組件
text5.setLineWrap(true);//自動換行
JScrollPane scr2=new JScrollPane(text5,JScrollPane.VERTICAL_SCROLLBAR_ALWAYS,JScrollPane.HORIZONTAL_SCROLLBAR_ALWAYS);//設置滾動條,水平和垂直滾動條始終顯示
scr2.setBounds(150, 500, 300, 50);//設置組件位置及大小
frame.add(scr2);//添加組件
final JButton but=new JButton("確定");//設置確定按鈕
but.setFont(fnt);//添加字體設置
but.setBounds(480, 500, 200, 50);//設置組件位置及大小
but.addActionListener(
new ActionListener(){ //採用內部匿名類
public void actionPerformed(ActionEvent e){
if(e.getSource()==but){ //判斷觸發器源是否是提交按鈕
text1.append("笑笑: "+lab10.getText()+"\n ");//在聊天記錄上添加文本
text1.append(text5.getText()+"\n"); //將輸入的聊天內容輸出在聊天記錄上
s=text5.getText(); //得到聊天內容
text5.setText(""); // 將聊天窗口內容設置為空
}
}
});
frame.add(but);//添加組件
//當前時間顯示
JLabel lab7=new JLabel("時間顯示:",JLabel.LEFT);//標簽實例化,文本左對齊
lab7.setBounds(450, 20, 100, 20);//設置組件位置及大小
frame.add(lab7);//添加組件
DateFormat df=DateFormat.getDateTimeInstance();//取得系統時間
String df2= df.format(new Date()); //將時間轉換成字元串
JLabel lab8=new JLabel(df2,JLabel.LEFT);//標簽實例化,文本左對齊
lab8.setBounds(520, 20, 130, 20);//設置組件位置及大小
frame.add(lab8);//添加組件
lab10=lab8; //傳遞時間顯示,以便能在聊天記錄上顯示記錄時間
new Time(lab8); //使時間動態顯示
//用戶列表顯示
JLabel lab6=new JLabel("用戶列表:",JLabel.LEFT);//標簽實例化,文本左對齊
lab6.setBounds(500, 40, 100, 20);//設置組件位置及大小
frame.add(lab6);//添加組件
JTextArea text6=new JTextArea();//標簽實例化,文本左對齊
text6.setEnabled(false);//文本不可編輯
text6.setLineWrap(true);//自動換行
JScrollPane scr3=new JScrollPane(text6,JScrollPane.VERTICAL_SCROLLBAR_ALWAYS,JScrollPane.HORIZONTAL_SCROLLBAR_ALWAYS);//設置滾動條,水平和垂直滾動條始終顯示
scr3.setBounds(460, 70, 220, 420);//設置組件位置及大小
frame.add(scr3);//添加組件
//窗口的屬性
frame.setSize(700,600);//窗口大小
frame.getContentPane().setBackground(Color.pink);//窗口的背景顏色
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);//關閉窗口時關閉程序
frame.setLocation(100,50);//在電腦桌面上出現的位置
frame.setVisible(true);//顯示窗口
//連個窗口連接
//建立Server Socket並等待連接請求
ServerSocket server =new ServerSocket(8889);
Socket socket=server.accept();
//連接建立,通過Socket獲取連接上的輸入/輸出流
BufferedReader in=new BufferedReader(new InputStreamReader(socket.getInputStream()));
final PrintWriter out =new PrintWriter(socket.getOutputStream());
//先讀取Client發送的數據,然後從標准輸入讀取數據發送給Client當接收到bye時關閉連接
String s1="",s2="";
//標志字元串,作為傳遞字元串使用
//得到其他窗口傳遞的字元串,並判斷是否結束
while(!(s1=in.readLine()).equals("bye")){
text6.setText("可可在線"); //當連接成功是在用戶列表中 輸出用戶名字
if(!s1.equals("")){ //如果傳遞的字元串不為 空
text1.append("可可: "+lab10.getText()+"\n ");//在聊天記錄上添加文本
text1.append(s1+"\n"); //將輸入的聊天內容輸出在聊天記錄上
}
s2=s;//將在聊天窗口中得到的字元串傳遞給輸出字元串
for(;s2.equals("")||s2.equals(null);s2=s){//當傳遞的字元串為空時等待用戶輸入聊天內容

}
s="";//將在聊天窗口中得到的字元串設為空
if(!s2.equals("")&&!s2.equals(null)){// s2不為空時做
out.println(s2); //向其他窗口輸出字元串
}
out.flush();//輸出聊天內容
}
//關閉連接
in.close();
out.close();
socket.close();
server.close();
}catch(Exception e){

}
}
//main函數
public static void main(String args[]){
new Login();//登錄實現 } }
}

}

時間類 class Time
package com.server;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.text.SimpleDateFormat;
import java.util.Date;
import javax.swing.JLabel;
import javax.swing.Timer; //時間類
public class Time {
public Time(JLabel time){
//構造方法 this.setTimer(time);
//設置時間
}
public void setTimer(JLabel time){
//設置時間方法
final JLabel varTime = time;
//傳遞組件
Timer timeAction = new Timer(1000, new ActionListener() {
//時間監聽
public void actionPerformed(ActionEvent e) {
long timemillis = System.currentTimeMillis();//得到系統時間
SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");//轉換日期顯示格式
varTime.setText(df.format(new Date(timemillis)));//輸出得到的時間
}
});
timeAction.start(); //開啟線程
}
}

❷ 語音聊天系統的設計與實現 源代碼,C/S結構,能夠運行的。需要實現實時語音。不是文字!也不是聊天室!

看來你來錯地方了,找源碼的話應該通過網路或者谷歌的實現實時語音你需要實現一個底層的編碼和解碼的語音通信庫,這個庫的作用就是實現流暢的語音通信了,其他的都是socket編程了,只要考慮下非同步處理基本沒有什麼問題了,源碼估計google上或許能找點思路,不過完成的工程估計是木有的

❸ 用c語言寫一個簡單聊天軟體!謝謝

聽了樓上的我都不敢說Windows程序設計中的SDK用的也是c語言了

傳的是《C語言高級編程及實例剖析》中的第六章的源碼,用的是SDK編程,裡面拉了控制項和用了多線程

樓主如果需要界面比較復雜的聊天室程序,用MFC當然方便點,但用SDK也沒有太大的問題(原理是一樣的,學哪一種,另一種就會了)。後者的教程貌似很難找。可以看看MFC的,比較好的是 《Vc++ 打造區域網聊天室》(視頻)

兩種資料在網上都找得到...

補充:當然,如果需要傳文件,圖片那些,就需要研究研究網路協議了,也只是添加些功能而已

❹ 求一個聊天室原碼,要C語言的,最好是UDP

http://www.cfxy.net/soft/晨風心雨http://tech.163.com/05/1009/13/1VKIKMKA00091589.html網易學院

用VC++6.0的Sockets API實現一個聊天室程序
http://tech.163.com/school · 2005-10-09 13:39:36 · 來源: 天極網 第1頁:用VC++6.0的Sockets API實現一個聊天室程序 第2頁:用VC++6.0的Sockets API實現一個聊天室程序

❺ 利用java語言實現基於C\S模式的聊天室程序。

一樣的 java照樣可以用eclipse設計cs程序
只是界面設計較弱
編譯完成以後 可以下載使用fatjar之類 生成jar文件
然後用installAnywhere打包 會生成exe文件去調用jar

至於通訊 可以用Nio或乾脆用開源的mina

eclipse 新建工程以後 new--other--windowbuilder---swing designer--application window
各版本菜單也許有區別

下載的源碼編譯不過 大多是版本或者環境或者路徑配置有誤
這個就是java編程序最討厭的一點。

❻ 求LIUNX 下 類似聊天室伺服器源碼 JAVA 或C 能在linux用就可以 接受客戶端聯接

1、聊天室的原理就是服務端建立socket監聽,客戶端建立socket客戶端與服務端socket交互,服務端通過廣播或單通道的方式將處理後的數據下發
2、服務端需要建立socket服務,採用何種技術不重要,java/c/.net這些都可以
3、客戶端需要實現socket客戶端,採用何種技術也不重要,java/c/.net這些都可以
4、服務端與客戶端的交互報文協議和交互流程需要事先約定好
5、具體實現舉例,給你提供個思路:
a. 服務端使用java編寫,編譯後啟動,啟動後就是實現一個socket的服務端,網上很多類似代碼,在linux下安裝一個jre就可以了
b.服務端採用C實現socket服務端,可以考慮使用ACE框架來簡化開發,linux下g++編譯很方便,編譯後直接運行,前提是ACE等相關工具和環境需要配置好
c.服務端構建一個J2EE的web應用,然後在linux下部署在tomcat下,啟動部分與方法a一致
6、其實很簡單,關鍵是了解聊天室的原理其實就是一個套接字通訊,與具體的技術或編程工具無關

❼ 如何用C語言編寫一個簡單的聊天室程序

這樣:

#include <stdlib.h>

#include <stdio.h>

#include <errno.h>

#include <string.h>

#include <unistd.h>

#include <netdb.h>

#include <sys/socket.h>

#include <netinet/in.h>

#include <sys/types.h>

#include <arpa/inet.h>

#include <pthread.h>

#define MAXLINE 100;

void *threadsend(void *vargp);

void *threadrecv(void *vargp);

int main()

{

int *clientfdp;

clientfdp = (int *)malloc(sizeof(int));

*clientfdp = socket(AF_INET,SOCK_STREAM,0);

struct sockaddr_in serveraddr;

struct hostent *hp;

bzero((char *)&serveraddr,sizeof(serveraddr));

serveraddr.sin_family = AF_INET;

serveraddr.sin_port = htons(15636);

serveraddr.sin_addr.s_addr = inet_addr("127.0.0.1");

if(connect(*clientfdp,(struct sockaddr *)&serveraddr,sizeof(serveraddr)) < 0){

printf("connect error ");

exit(1);

}

pthread_t tid1,tid2;

printf("connected ");

while(1){

pthread_create(&tid1,NULL,threadsend,clientfdp);

pthread_create(&tid2,NULL,threadrecv,clientfdp);

}

return EXIT_SUCCESS;

}

void *threadsend(void * vargp)

{

//pthread_t tid2;

int connfd = *((int *)vargp);

int idata;

char temp[100];

while(1){

//printf("me: ");

fgets(temp,100,stdin);

send(connfd,temp,100,0);

printf(" client send OK ");

}

printf("client send ");

return NULL;

}

void *threadrecv(void *vargp)

{

char temp[100];

int connfd = *((int *)vargp);

while(1){

int idata = 0;

idata = recv(connfd,temp,100,0);

if(idata > 0){

printf("server : %s ",temp);

}

}

return NULL;

}

(7)c聊天室源碼擴展閱讀:

注意事項

linux下編譯多線程代碼時,shell提示找不到 pthread_create函數,原因是 pthread.h不是linux系統默認載入的庫文件,應該使用類似如下gcc命令進行編譯:

gcc echoserver.c -lpthread -o echoserver

只要注意 -lpthread參數就可以了。

❽ 求寫C語言聊天室的思路

聊天室程序原原理沒簡單,利用網路進行數據交互,但單單用C寫聊天室,工作量還是很大的
主要是兩個部分,界面和網路
界面不是標准C的強項,直接用純C在windwos下寫界面是一件很復雜的事,且事實上,現在基本沒有人這么做了,一般會用C++加上第三方的庫或控制項,如QT,MFC,VCL等,當然QT是首選,但要有相當的C++的編程基礎(而非C的)
而C的網路編程也是有技術難度,直接調用低層的socket,也基本沒有人做了

❾ JAVA簡單C/S聊天室程序~~~

package JavaNet;

import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.EventQueue;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.Socket;
import java.net.UnknownHostException;
import javax.swing.DefaultComboBoxModel;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JList;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JSplitPane;
import javax.swing.JTextArea;
import javax.swing.JTextField;

public class ClientOneToOne_ClientFrame extends JFrame {
private JTextField tf_newUser;
private JList user_list;
private JTextArea ta_info;
private JTextField tf_send;
PrintWriter out;// 聲明輸出流對象
private boolean loginFlag = false;// 為true時表示已經登錄,為false時表示未登錄

/**
* Launch the application
*
* @param args
*/
public static void main(String args[]) {
EventQueue.invokeLater(new Runnable() {
public void run() {
try {
ClientOneToOne_ClientFrame frame = new ClientOneToOne_ClientFrame();
frame.setVisible(true);
frame.createClientSocket();// 調用方法創建套接字對象
} catch (Exception e) {
e.printStackTrace();
}
}
});
}

public void createClientSocket() {
try {
Socket socket = new Socket("127.0.0.1", 1978);// 創建套接字對象
out = new PrintWriter(socket.getOutputStream(), true);// 創建輸出流對象
new ClientThread(socket).start();// 創建並啟動線程對象
} catch (UnknownHostException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}

class ClientThread extends Thread {
Socket socket;

public ClientThread(Socket socket) {
this.socket = socket;
}

public void run() {
try {
BufferedReader in = new BufferedReader(new InputStreamReader(
socket.getInputStream()));// 創建輸入流對象
DefaultComboBoxModel model = (DefaultComboBoxModel) user_list
.getModel();// 獲得列表框的模型
while (true) {
String info = in.readLine().trim();// 讀取信息

if (!info.startsWith("MSG:")) {
boolean itemFlag = false;// 標記是否為列表框添加列表項,為true不添加,為false添加
for (int i = 0; i < model.getSize(); i++) {
if (info.equals((String) model.getElementAt(i))) {
itemFlag = true;
}
}
if (!itemFlag) {
model.addElement(info);// 添加列表項
} else {
itemFlag = false;
}
} else {
ta_info.append(info + "\n");// 在文本域中顯示信息
if (info.equals("88")) {
break;// 結束線程
}
}
}
} catch (IOException e) {
e.printStackTrace();
}
}
}

private void send() {
if (!loginFlag) {
JOptionPane.showMessageDialog(null, "請先登錄。");
return;
}
String sendUserName = tf_newUser.getText().trim();
String info = tf_send.getText();// 獲得輸入的信息
if (info.equals("")) {
return;// 如果沒輸入信息則返回,即不發送
}
String receiveUserName = (String) user_list.getSelectedValue();// 獲得接收信息的用戶
String msg = sendUserName + ":發送給:" + receiveUserName + ":的信息是: "
+ info;// 定義發送的信息
if (info.equals("88")) {
System.exit(0);// 如果沒輸入信息是88,則退出
}
out.println(msg);// 發送信息
out.flush();// 刷新輸出緩沖區
tf_send.setText(null);// 清空文本框
}

/**
* Create the frame
*/
public ClientOneToOne_ClientFrame() {
super();
setTitle("客戶端一對一通信——客戶端程序");
setBounds(100, 100, 385, 288);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

final JPanel panel = new JPanel();
getContentPane().add(panel, BorderLayout.SOUTH);

final JLabel label = new JLabel();
label.setText("輸入聊天內容:");
panel.add(label);

tf_send = new JTextField();
tf_send.addActionListener(new ActionListener() {
public void actionPerformed(final ActionEvent e) {
send();// 調用方法發送信息
}
});
tf_send.setPreferredSize(new Dimension(180, 25));
panel.add(tf_send);

final JButton button = new JButton();
button.addActionListener(new ActionListener() {
public void actionPerformed(final ActionEvent e) {
send();// 調用方法發送信息
}
});
button.setText("發 送");
panel.add(button);

final JSplitPane splitPane = new JSplitPane();
splitPane.setDividerLocation(100);
getContentPane().add(splitPane, BorderLayout.CENTER);

final JScrollPane scrollPane = new JScrollPane();
splitPane.setRightComponent(scrollPane);

ta_info = new JTextArea();
scrollPane.setViewportView(ta_info);

final JScrollPane scrollPane_1 = new JScrollPane();
splitPane.setLeftComponent(scrollPane_1);

user_list = new JList();
user_list.setModel(new DefaultComboBoxModel(new String[] { "" }));
scrollPane_1.setViewportView(user_list);

final JPanel panel_1 = new JPanel();
getContentPane().add(panel_1, BorderLayout.NORTH);

final JLabel label_1 = new JLabel();
label_1.setText("輸入用戶名稱:");
panel_1.add(label_1);

tf_newUser = new JTextField();
tf_newUser.setPreferredSize(new Dimension(180, 25));
panel_1.add(tf_newUser);

final JButton button_1 = new JButton();
button_1.addActionListener(new ActionListener() {
public void actionPerformed(final ActionEvent e) {
if (loginFlag) {
JOptionPane.showMessageDialog(null, "在同一窗口只能登錄一次。");
return;
}
String userName = tf_newUser.getText().trim();// 獲得登錄用戶名
out.println("用戶:" + userName);// 發送登錄用戶的名稱
out.flush();// 刷新輸出緩沖區
tf_newUser.setEnabled(false);
loginFlag = true;
}
});
button_1.setText("登 錄");
panel_1.add(button_1);
}
}
package JavaNet;

import java.awt.BorderLayout;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.Hashtable;
import java.util.Iterator;
import java.util.Set;
import javax.swing.JFrame;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;

public class ClientOneToOne_ServerFrame extends JFrame {
private JTextArea ta_info;
private ServerSocket server; // 聲明ServerSocket對象
private Socket socket; // 聲明Socket對象socket
private Hashtable<String, Socket> map = new Hashtable<String, Socket>();// 用於存儲連接到伺服器的用戶和客戶端套接字對象

public void createSocket() {
try {
server = new ServerSocket(1978);
while (true) {
ta_info.append("等待新客戶連接......\n");
socket = server.accept();// 創建套接字對象
ta_info.append("客戶端連接成功。" + socket + "\n");
new ServerThread(socket).start();// 創建並啟動線程對象
}
} catch (IOException e) {
e.printStackTrace();
}
}

class ServerThread extends Thread {
Socket socket;

public ServerThread(Socket socket) {
this.socket = socket;
}

public void run() {
try {
BufferedReader in = new BufferedReader(new InputStreamReader(
socket.getInputStream()));// 創建輸入流對象
while (true) {
String info = in.readLine();// 讀取信息
String key = "";
if (info.startsWith("用戶:")) {// 添加登錄用戶到客戶端列表
key = info.substring(3, info.length());// 獲得用戶名並作為鍵使用
map.put(key, socket);// 添加鍵值對
Set<String> set = map.keySet();// 獲得集合中所有鍵的Set視圖
Iterator<String> keyIt = set.iterator();// 獲得所有鍵的迭代器
while (keyIt.hasNext()) {
String receiveKey = keyIt.next();// 獲得表示接收信息的鍵
Socket s = map.get(receiveKey);// 獲得與該鍵對應的套接字對象
PrintWriter out = new PrintWriter(s
.getOutputStream(), true);// 創建輸出流對象
Iterator<String> keyIt1 = set.iterator();// 獲得所有鍵的迭代器
while (keyIt1.hasNext()) {
String receiveKey1 = keyIt1.next();// 獲得鍵,用於向客戶端添加用戶列表
out.println(receiveKey1);// 發送信息
out.flush();// 刷新輸出緩沖區
}
}

} else {// 轉發接收的消息
key = info.substring(info.indexOf(":發送給:") + 5, info
.indexOf(":的信息是:"));// 獲得接收方的key值,即接收方的用戶名
String sendUser = info.substring(0, info
.indexOf(":發送給:"));// 獲得發送方的key值,即發送方的用戶名
Set<String> set = map.keySet();// 獲得集合中所有鍵的Set視圖
Iterator<String> keyIt = set.iterator();// 獲得所有鍵的迭代器
while (keyIt.hasNext()) {
String receiveKey = keyIt.next();// 獲得表示接收信息的鍵
if (key.equals(receiveKey)
&& !sendUser.equals(receiveKey)) {// 如果是發送方,但不是用戶本身
Socket s = map.get(receiveKey);// 獲得與該鍵對應的套接字對象
PrintWriter out = new PrintWriter(s
.getOutputStream(), true);// 創建輸出流對象

out.println("MSG:"+info);// 發送信息
out.flush();// 刷新輸出緩沖區
}
}
}
}
} catch (IOException e) {
ta_info.append(socket + "已經退出。\n");
}
}
}

/**
* Launch the application
*
* @param args
*/
public static void main(String args[]) {
ClientOneToOne_ServerFrame frame = new ClientOneToOne_ServerFrame();
frame.setVisible(true);
frame.createSocket();
}

/**
* Create the frame
*/
public ClientOneToOne_ServerFrame() {
super();
setTitle("客戶端一對一通信——伺服器端程序");
setBounds(100, 100, 385, 266);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

final JScrollPane scrollPane = new JScrollPane();
getContentPane().add(scrollPane, BorderLayout.CENTER);

ta_info = new JTextArea();
scrollPane.setViewportView(ta_info);
}
}

❿ C語言網路聊天室編程

20分,哈!

熱點內容
安卓手機怎麼加速進程 發布:2025-01-18 07:29:48 瀏覽:681
塞恩拐彎腳本 發布:2025-01-18 07:29:37 瀏覽:742
師資配置含哪些內容 發布:2025-01-18 07:17:35 瀏覽:706
江西腳本 發布:2025-01-18 07:14:38 瀏覽:392
php中i方法 發布:2025-01-18 07:13:19 瀏覽:369
FTP寶塔Linux面板 發布:2025-01-18 07:10:05 瀏覽:396
無線網卡怎麼改密碼 發布:2025-01-18 06:54:41 瀏覽:766
ava動態編譯 發布:2025-01-18 06:54:39 瀏覽:765
中國學位論文全文資料庫 發布:2025-01-18 06:43:49 瀏覽:689
全局變數存儲類別 發布:2025-01-18 06:39:29 瀏覽:424