PDA

View Full Version : Chương trình Chat, gửi dữ liệu qua Lan ( C#)



bluebingo
13-03-2006, 19:42
Em đang có bài tập về vấn đề này nhưng chưa biết giải quyết như thế nào, ai đã làm rồi thì cho em hỏi một chút !

gianhut
13-03-2006, 20:47
bạn fải nêu rõ cái difficulties của bạn ra chớ. nói chung chung thế ai giúp

netwalker
13-03-2006, 21:39
Em đang có bài tập về vấn đề này nhưng chưa biết giải quyết như thế nào, ai đã làm rồi thì cho em hỏi một chút !

Vào đây đọc source vậy :D
http://codeproject.com/csharp/#Internet

bluebingo
13-03-2006, 23:10
em chưa biết bắt đầu từ đâu, cả rất cảm ơn anh netwalker cho em link nhưng em đang cần người chỉ bảo, còn code thì tính sau !

Dau_Dat
14-03-2006, 12:51
Đầu tiên bạn hãy tìm hiểu về Socket là gì?, dùng thế nào?, trong C# nó có namespace này: System.Nets.Sockets, để tạo một ứng dụng chat bằng C# khá đơn giản vì C# hỗ trợ rất nhiều. Cơ chế tóm tắt là như sau: Bạn cần có một Server và một Client, Server dùng để lắng nghe và xử lý các yêu cầu của Client, còn Client thì nhận thông tin từ Server vậy thôi!(^_^)

bluebingo
14-03-2006, 20:43
thế em có hai máy nối với nhau ( ở trường em có mấy máy thực hành của sinh viên nối lan với nhau ) muốn chat với nhau, chuyển dữ liệu qua cho nhau thì làm như thế hả anh ?

Dau_Dat
15-03-2006, 08:21
Như cơ chế đã nói ở trên, muốn hai máy trao đổi dữ liệu được với nhau bạn cần phải có một máy đóng vai trò làm Server và một máy đóng vai trò làm Client. Để một Client có thể kết nối đến Server thì Client phải biết hai thông số: Số hiệu cổng và địa chỉ IP(hoặc tên), trong đó Server đóng vai trò lắng nghe Client và xử lý các thông tin mà Client gửi tới. Hai máy trao đổi với nhau như vậy mà nhiều máy cũng vậy, bao giờ cũng phải có một cái đóng vai trò Server để nhận thông tin từ các máy Client. Đối với 2 máy thì quá trình như sau: Client->Server, Server->Client, với nhiều máy thì: Client->Server->Client. Ngoài ra còn có thêm các giao thức để truyền nhận dữ liệu có hai giao thức cơ bản mà bạn sẽ dùng là TCP(hướng kết nối) và UDP(không hướng kết nối), hy vọng là giúp ích được cho bạn.

Quên mất, số hiệu cổng ở đây là do bạn tự đặt để tránh trùng với một số cổng dịch vụ bạn nên đăt cao cao một chút, ví dụ như 8000 chẳng hạn.

Csharp_TN
16-03-2006, 12:06
Lên codeproject >> đầy

yeutnhiu_infor
12-04-2008, 16:50
Chào các anh! em cũng đang làm chương trình chát server client rùi nhưng em chỉ làm được có 1 server và 1 client chat voi nhau thôi. để 2 hay nhìu client chát được với nhau thì phải làm thế nào àh.Mong các anh ai có code hoặc bít thì chỉ dùm em nha ! thanks nhìu.

xsamxungx
12-04-2008, 21:54
java thì mình có thể giúp còn c# chưa làm :D

yeutnhiu_infor
14-04-2008, 16:45
!em đã viết chương trình client server rùi nhưng chỉ có 2 mát chát xong xong dzới nhau thôi!! hic:( Giờ em mún thêm 1 client nửa để 3 máy có thẻ chát với nhau => seo đây la code em úp len nè mấy anh pro dzô xem rùi giưp em dzới nha! thanks mấy anh trước he'using System;
using System.IO;
using System.Net;
using System.Net.Sockets;
using System.Text;
class StreamTcpClient
{
public static void Main()
{
string data;
string input;
IPEndPoint ipep = new IPEndPoint(
IPAddress.Parse("127.0.0.1"), 9050);
Socket server = new Socket(AddressFamily.InterNetwork,
SocketType.Stream, ProtocolType.Tcp);
try
{
server.Connect(ipep);
}
catch (SocketException e)
{
Console.WriteLine("Unable to connect to server.");
Console.WriteLine(e.ToString());
return;
}

NetworkStream ns = new NetworkStream(server);
StreamReader sr = new StreamReader(ns);
StreamWriter sw = new StreamWriter(ns);
data = sr.ReadLine();
Console.WriteLine(data);
Console.WriteLine("please enter yourname:");
input=Console.ReadLine();
while(input=="")
{
Console.WriteLine("please enter yourname:");
input=Console.ReadLine();
}
string ob=input;
while(true)
{
Console.WriteLine(ob);
input = Console.ReadLine();
if (input == "exit")
break;
//string ob="Client:";

sw.WriteLine(ob);
sw.WriteLine(input);
sw.Flush();
data=sr.ReadLine();
Console.WriteLine(data);
data=sr.ReadLine();
Console.WriteLine(data);

}
Console.WriteLine("Disconnecting from server...");
sr.Close();
sw.Close();
ns.Close();
server.Shutdown(SocketShutdown.Both);
server.Close();
}
}
using System;
using System.IO;
using System.Net;
using System.Net.Sockets;
using System.Text;
class StreamTcpSrvr
{
public static void Main()
{
string data,input;
IPEndPoint ipep = new IPEndPoint(IPAddress.Any, 9050);
Socket newsock = new Socket(AddressFamily.InterNetwork,
SocketType.Stream, ProtocolType.Tcp);
newsock.Bind(ipep);
newsock.Listen(10);
Console.WriteLine("Waiting for a client...");
Socket client = newsock.Accept();
IPEndPoint newclient = (IPEndPoint)client.RemoteEndPoint;
Console.WriteLine("Connected with {0} at port {1}",
newclient.Address, newclient.Port);
NetworkStream ns = new NetworkStream(client);
StreamReader sr = new StreamReader(ns);
StreamWriter sw = new StreamWriter(ns);
string welcome = "Welcome to my test server";
sw.WriteLine(welcome);
sw.Flush();
while(true)
{
try
{

data = sr.ReadLine();
}
catch (IOException)
{
break;
}
Console.WriteLine(data);
data=sr.ReadLine();
Console.WriteLine(data);
Console.WriteLine("SerVer:");
input=Console.ReadLine();
if(input=="exit")
break;
string ob="SerVer:";
sw.WriteLine(ob);
sw.WriteLine(input);
sw.Flush();

}
Console.WriteLine("Disconnected from {0}", newclient.Address);
sw.Close();
sr.Close();
ns.Close();
}
}

tdbinh
14-04-2008, 17:01
èo.. sao em cứ hỏi chung chung thế nhỉ?
trước khi làm gì, em phải gạch đầu dòng ra xem em định làm cái gì? cái ứng dụng nó sẽ có tính năng ntn? chạy trên môi trường gì? bao nhiêu người dùng? dự kiến ra sao? rồi liên quan tới ngôn ngữ mình chọn (ở đây là C#), thì nó hỗ trợ network programming ntn? blah blah...

từ từ đi từng bước, thấm dần thì nó mới là của mình, cứ copy code thế rồi 1 ngày sẽ thấy buồn đấy

đôi lời phọt phẹt
chúc vui.

[=========> Bổ sung bài viết <=========]

àh, bổ sung thêm, như mấy đồng chí kia nói, lên codeproject hay sourceforge nhiều vật vã code samples

nowforever
15-04-2008, 10:45
Bạn gặp vấn đề với việc chat nhiều client chứ gì.
Mình có giải pháp nhỏ nhỏ góp ý. Khi user login, bạn sinh 1 cái key (có nhiều cách sinh ID trong .NET lắm, tham khảo google hen), rùi register cái key đó vào server. Server dựa vào cái key đó để quản lý client. Khi có message, user sẽ broadcast message cho tất cả client. Client nào thấy message có key của mình thì hiển thị. Không thì thôi.
Cách này hơi chuối ở chỗ hơi tốn băng thông, nhưng được cái server khỏi quản client. Tiện!!! Đối với ct nhỏ viết chơi thì ko có vấn đề gì. Hồi trước mình làm java làm theo cách này. Bạn thử hen.

herofit
15-04-2008, 13:33
Bạn gặp vấn đề với việc chat nhiều client chứ gì.
Mình có giải pháp nhỏ nhỏ góp ý. Khi user login, bạn sinh 1 cái key (có nhiều cách sinh ID trong .NET lắm, tham khảo google hen), rùi register cái key đó vào server. Server dựa vào cái key đó để quản lý client. Khi có message, user sẽ broadcast message cho tất cả client. Client nào thấy message có key của mình thì hiển thị. Không thì thôi.
Cách này hơi chuối ở chỗ hơi tốn băng thông, nhưng được cái server khỏi quản client. Tiện!!! Đối với ct nhỏ viết chơi thì ko có vấn đề gì. Hồi trước mình làm java làm theo cách này. Bạn thử hen.

ý tưởng của bạn nowforever là một giải pháp nhưng. theo mình nghĩ lên suy nghĩ theo kiểu lập trình hướng đối tượng, mỗi khi có client kết nối sẽ tạo ra một đối tượng mới giao tiếp với client trong khi vẫn lắng nghe các kết nối khác
bạn có thể học ý tưởng này qua sách của Dương Quang Thiện bộ 8 quyển có ví dụ minh họa

yeutnhiu_infor
15-04-2008, 19:02
!Em Thanks các anh nhe! Ý tưởng thì em cũng có đôi chút! tại gì chương trình của em là server lắng nghe kết nối của một máy bát kì nhưng khi kết nối được thiết lập thì server ko còn lắng nghe nửa !Em cũng đang mún cho server lun o trang thái lắng nghe chỉ cần có bất kứ client nào yêu cầu là server sẽ kết nối! nhưng gì kiến thức kòn cạn lém nên chưa bít lập trình thế nào Em sẽ tham khảo sách của anh herofit nếu có gì théc méc em sẽ nhờ mấy anh tư vấn lần nửa hé!Thanks các anh nhé!