java與c#使用Socket實現區域網聊天
先執行一個java寫的區域網聊天,效果圖如下
後使用c#圖形修改如下:
c#程式碼:
servlet服務端
Client客戶端using System; using System.Collections.Generic; using System.Drawing; using System.Windows.Forms; using System.Net; using System.Net.Sockets; using System.Threading; using System.IO; using System.Text; using System.Text.RegularExpressions; namespace Server { public partial class MainForm : Form { private TcpListener listener; private Dictionary<String,TcpClient> socketList; private bool tag = true; private StringBuilder charList; public MainForm() { InitializeComponent(); Control.CheckForIllegalCrossThreadCalls = false; } void Bu_StartClick(object sender, EventArgs e) { cb_chatList.Items.Clear(); selectChat.Text=""; int port = 8888; //建立服務端,並且啟動 try{ listener = new TcpListener(IPAddress.Parse(ipAddress()),port); listener.Start(); bu_Start.Enabled = false; bu_stop.Enabled = true; }catch(Exception ex) { MessageBox.Show("伺服器啟動失敗, 原因:"+ex.Message); bu_Start.Enabled = true; bu_stop.Enabled = false; return; } selectChat.Text = "伺服器啟動成功,訪問IP:"+ipAddress()+" 埠號:"+port; //記錄住連線的客戶端 socketList = new Dictionary<String,TcpClient>(); charList = new StringBuilder(); //使用多執行緒,用於多個客戶端接入 Thread th = new Thread(new ThreadStart(executeTask)); th.Start(); } public void executeTask() { while(tag) { //等待使用者連線 TcpClient client = null; try{ client = listener.AcceptTcpClient(); }catch(Exception) { } Thread th = new Thread(executeRead); th.Start((Object)client); } } public void executeRead(Object pamars) { //永久監聽讀取客戶端 TcpClient client = pamars as TcpClient; while(tag) { NetworkStream ns = client.GetStream(); StreamReader sr = new StreamReader(ns); String msg = String.Empty; String people = String.Empty; try { msg = sr.ReadLine(); if(msg.IndexOf("<clientName>")!=-1) { msg = Regex.Split(msg,"=")[1]; cb_chatList.Items.Add(msg); charList.Append(msg).Append("<@>"); socketList.Add(msg,client); msg = "<br>歡迎【"+msg+"】光臨<br>"; } selectChat.AppendText(msg.Replace("<br>","\r\n")); sendMsg(String.Empty,msg); } catch (Exception) { //MessageBox.Show(ex.Message.ToString()); break; } } } public void sendMsg(String target,String msg) { if(String.Empty!=target) { TcpClient client = socketList[target]; StreamWriter sw = new StreamWriter(client.GetStream()); sw.WriteLine(msg); sw.Flush(); }else{ Dictionary<String,TcpClient>.KeyCollection keyColl = socketList.Keys; foreach (String name in keyColl) { StreamWriter sw = new StreamWriter(socketList[name].GetStream()); sw.WriteLine(msg+"<@
[email protected]>"+charList.ToString()); sw.Flush(); } } } /*根據計算名獲取IP地址*/ public String ipAddress() { IPAddress[] address = Dns.GetHostAddresses(Dns.GetHostName()); return address[2].ToString(); } void ServerFromFormClosing(object sender, FormClosingEventArgs e) { e.Cancel = false; if(tag) tag = false; if(listener!=null) listener.Stop(); } void Bu_stopClick(object sender, EventArgs e) { bu_Start.Enabled = true; bu_stop.Enabled = false; if(tag) tag = false; if(listener!=null) listener.Stop(); } } }
using System;
using System.Drawing;
using System.Windows.Forms;
using System.Threading;
using System.Net;
using System.Net.Sockets;
using System.IO;
using System.Text;
using System.Text.RegularExpressions;
namespace Client
{
public partial class MainForm : Form
{
private System.Windows.Forms.Timer closeWindowTimer;
private StreamReader sr;
private StreamWriter sw;
private TcpClient tc;
private ClientLong cl;
private bool tag = true;
public MainForm(TcpClient tcp,ClientLong clo)
{
cl = clo;
tc = tcp;
InitializeComponent();
Control.CheckForIllegalCrossThreadCalls = false;
bu_simple.Hide();
}
void ClientFromLoad(object sender, EventArgs e)
{
PiayCheckedChanged();
}
/*事件方法*/
public void PiayCheckedChanged()
{
closeWindowTimer = new System.Windows.Forms.Timer();
closeWindowTimer.Interval = 1000;
closeWindowTimer.Tick += new EventHandler(theout);
closeWindowTimer.Start();
}
/*執行的事件*/
public void theout(object source, EventArgs e)
{
//這裡單獨開一個執行緒用來顯示資訊
try{
Thread t1 = new Thread(new ThreadStart(readMsg));
t1.Start();
}catch(Exception)
{
}
}
void readMsg()
{
if(tag && tc!=null){
sr = new StreamReader(tc.GetStream());
String msg = sr.ReadLine();
String[] address = Regex.Split(msg,"<@ [email protected]>");
chatText.AppendText(address[0].Replace("<br>","\r\n"));
address = Regex.Split(address[1],"<@>");
cb_chatList.Items.Clear();
foreach (String s in address)
{
if(!String.IsNullOrEmpty(s) && s != cl.clientName)
cb_chatList.Items.Add(s);
}
}
}
void Button1Click(object sender, EventArgs e)
{
if(String.IsNullOrEmpty(textBox2.Text)){
MessageBox.Show("請輸入訊息");return;
}
sw = new StreamWriter(tc.GetStream());
sw.WriteLine("<br>"+cl.clientName+" "+DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss")+"<br> "+textBox2.Text);
textBox2.Text = "";
sw.Flush();
}
void Bu_exitClick(object sender, EventArgs e)
{
MainFormFormClosing(null,null);
}
void Button2Click(object sender, EventArgs e)
{
chatText.Text = "";
}
void MainFormFormClosing(object sender, FormClosingEventArgs e)
{
closeWindowTimer.Stop();
cl.Close();
tag = false;
if(sr!=null)
sr.Close();
if(sw!=null)
sw.Close();
}
void Bu_simpleClick(object sender, EventArgs e)
{
String selected = cb_chatList.Text;
if(selected==null)
{
MessageBox.Show("請選擇單聊物件");
return;
}
}
}
}
補充:
1:上傳下載檔案、聊天表情、私聊、踢人.......都是可以擴充套件的功能。
只是目前還沒有可執行的思路,希望有相同愛好者多多提出寶貴意見。我會繼續關注。
相關推薦
java與c#使用Socket實現區域網聊天
先執行一個java寫的區域網聊天,效果圖如下 後使用c#圖形修改如下: c#程式碼: servlet服務端 using System; using System.Collections.Generic; using System.Drawing; using Sys
從2-3-4樹到紅黑樹(下) Java與C的實現
歡迎探討,如有錯誤敬請指正 相關部落格: 1. 實現技巧 為了簡化程式碼和減少不必要的開銷,在具體的實現中我們定義一個偽根節點ROOT且只定義一個NIL節點。偽根節點的左子支永遠指向NIL節點,NIL節點的左右子支又指向它自身。偽根節點的右子支才表示真正的紅黑樹。 2. Java語言實現 packa
java與C# Socket的區別、他們之間的通訊
先看java程式碼 java伺服器端: import java.io.IOException; import java.io.InputStream; import java.net.ServerSocket; import java.net.Socket;
關於Java與c++隱藏、重寫不同實現機制的探討
tail namespace 文獻 ide archive pretty proc font 分開 一、文章來由 本人如今用c++很多其它。可是曾經Java也寫過不少,Java和c++非常像,可是深入挖一些,Java跟c++的差別非常大,就拿剛剛發的另
[工作小記]JAVA與C#的Socket通信
motion pmo sleep ddr trace ktr 不同的 ram target 在日常的開發中,不同的傳感器支持的開發語言常常是不同的。例如Kinect一般是用C++開發的,Leapmotion用JAVA開發比較多。 去年暑假(17年暑假)做的一個項目是:用Le
如何一步步實現JAVA與C# AES加密結果相同
實現JAVA與C# AES加密結果相同 最近公司開發一個電池溯源的介面,對方給的是一個java的demo,使用的是AES加密,但是我們的整合平臺是使用C#開發的,所有必須把java中的AES加密方法改成C#實現。對方給的demo如下 /**
Java中使用socket實現客戶端與服務端互動
Socket解釋: 網路上的兩個程式通過一個雙向的通訊連線實現資料的交換,這個連線的一端稱為一個socket。 Socket的英文原義是“孔”或“插座”。作為BSD UNIX的程序通訊機制,取後一種意思。通常也稱作"套接字",用於描述IP地址和埠,是一個通訊鏈的控制代碼,可以用來實現不同虛擬機器或不同計
java與c語言之間的socket通訊—c客戶端java伺服器端
寫在前面的宣告:程式例子均執行在ubuntu(是一個以桌面應用為主的Linux作業系統)上。當然你也可以把java執行在其它系統上,這裡只是為了方便。 上一篇文章已經說明了關於socket的一些知識,but這是遠遠不夠的,我相信只要你感興趣,學習它並不是什麼難事。 好吧,我
Android開發 通過JNI實現JAVA與C/C++程式間的呼叫和回撥
在一些Android應用的開發中,需要通過JNI和 Android NDK工具實現JAVA和C/C++之間的相互呼叫。 Java Native Interface (JNI)標準是java平臺的一部分,它允許Java程式碼和其他語言寫的程式碼進行
Java與C#通過Byte[]位元組陣列實現訊息傳遞,跨語言資料序列化
支援型別: byte、short、int、long、float、double、boolean、char、String、byte[] Java程式碼 package com.itshidu.io; import java.nio.charset.Charset;
C#編寫的區域網聊天工具(本菜鳥剛學Socket,拿來分享下~~~)
class Server //服務端方法 { #region 繫結IP、埠 IniOperate io = new IniOperate("C:\\lwj.ini"); public Socket Bind()
C++ socket 實現服務端與客戶端互相通訊
// Server.cpp : Defines the entry point for the console application. // #include "winsock2.h" #pragma comment(lib, "ws2_32.lib")
Java與C之間的socket通訊
最近正在開發一個基於指紋的音樂檢索應用,演算法部分已經完成,所以嘗試做一個Android App。Android與伺服器通訊通常採用HTTP通訊方式和Socket通訊方式。由於對web伺服器程式設計瞭解較少,而且後臺伺服器已經採用原始socket實現與c客戶端通訊,這就要求
Unity 與C#伺服器 實現Socket的UDP通訊(多客戶端)
前言 上一篇簡單的介紹了下Unity客戶端和伺服器的Socket通訊,但是還不能實現多個客戶端與伺服器的通訊,所以今天在這邊把前面的工程完善一下(使用的是上篇講到的UdpClient類來實現),實現多個客戶端與伺服器的udp通訊。效果圖如下,兩個客戶端可以向伺服器傳送訊息,
Java中利用socket實現簡單的服務端與客戶端的通訊(入門級)
Java程式設計中,要想要使用網路通訊,就離不開Socket程式設計,在此對socket進行簡單的介紹。首先宣告,這是一個入門級的介紹,僅僅簡單的實現了客戶端向服務端傳送資料,服務端正常的接收資料,當接收到特定的資料時,服務端和客戶端都關閉,一個服務端對應一個客戶端,不涉及
Java中利用socket實現簡單的服務端與客戶端的通訊(基礎級)
在上一篇文章中,簡單的介紹了java中入門級的socket程式設計,簡單的實現了客戶端像伺服器端傳送資料,伺服器端將資料接收並顯示在控制檯,沒有涉及多執行緒。上一篇文章的連結:Java中利用socket實現簡單的服務端與客戶端的通訊(入門級) 這次,我們將上一節中的程式碼進
JAVA與C++用socket通訊出現中文亂碼
java接收C++資料出現中文亂碼: 將java這邊的socket編碼改為GBK就行了! java和C++使用Socket通訊,其實底層Socket都是相通的,所以只需要按照各自的語法去做就是了。 java伺服器端使用ServerSocket的accept建立S
使用C#+socket實現用移動設備控制的虛擬手柄
sock endpoint network 回車 byte arraylist program 行處理 favor 最近在和同學玩死神vs火影。以懷念小時候,突然認為用鍵盤玩的不夠暢快,因此萌生了寫一個虛擬手柄的念頭。 我的思路是在移動設備(iOS、Android)上實
Unity3d 腳本與C#Socket服務器傳輸數據
type ucc 字符串 ror callback internet cli 異步 spa Test.cs腳本 ---------------------------------------------------------------------------------
JAVA與C++,C與C++的差別
-m content 才幹 hit 沒有 span 自增 ng- data- 首先來分析JAVA與C++的差別: JAVA是純面向對象的語言,而C++是基於面向對象過程的語言。 JAVA有著垃圾回收機制。它的語法是C+