first commit

This commit is contained in:
2026-07-16 12:21:20 +02:00
commit 4fb2fb2ae0
28 changed files with 492 additions and 0 deletions
Executable
+154
View File
@@ -0,0 +1,154 @@
using System;
using System.Net;
using System.Net.Sockets;
using System.Reflection;
using System.Reflection.Metadata;
using System.Text;
using System.Text.Json;
using System.Threading;
using System.Threading.Tasks;
public class Peer {
private readonly TcpListener _listener;
private string _targetIp = "";
private int _targetPort = 0;
private int _port = 0;
private string _name = "";
private bool running = true;
private bool hasConnected = false;
private bool userOnline = false;
public Peer(int port, string targetIp, int targetPort, string name) {
_listener = new TcpListener(IPAddress.Any, port);
_port = port;
_targetIp = targetIp;
_targetPort = targetPort;
_name = name;
}
public async Task Start(){
Task listen = StartListening();
Task chat = StartChat();
await Task.WhenAll(listen, chat);
}
private async Task StartListening(){
_listener.Start();
Console.WriteLine($"[info] Nasłuchuje na: 127.0.0.1:{_port}");
while(running){
try {
TcpClient client = await _listener.AcceptTcpClientAsync();
_ = Task.Run(() => HandleClient(client));
} catch(Exception ex){
Console.WriteLine($"[błąd] Wystąpił nieoczekiwany błąd przy nasłuchiwaniu: {ex.Message}");
}
}
}
private async Task HandleClient(TcpClient client) {
try {
using NetworkStream stream = client.GetStream();
using StreamReader reader = new(stream, Encoding.UTF8);
while(running){
string? message = await reader.ReadLineAsync();
if(message == null) break;
Content? contentData = JsonSerializer.Deserialize<Content>(message);
if(contentData == null) break;
ProcessMessage(contentData);
}
} catch(Exception ex){
Console.WriteLine(ex.Message);
}
}
private void ProcessMessage(Content contentData){
try {
ClearConsoleLine();
Console.SetCursorPosition(0, Console.CursorTop - 1);
if(contentData.Message == "!exit"){
running = false;
Console.WriteLine($"\n[info] Użytkownik {contentData.Sender} zakończył sesję");
}
if(contentData.Message.Contains("dołączył/a do sesji") && !userOnline){
SendMessage($"jest online! Przywitaj się :D", false).Wait();
}
if(contentData.ByUser){
Console.WriteLine($"\n[{contentData.SentAt}] {contentData.Sender}: {contentData.Message}");
} else {
Console.WriteLine($"\n[info] [{contentData.SentAt}] Użytkownik {contentData.Sender} {contentData.Message}");
}
Console.Write("> ");
} catch (Exception ex) {
Console.WriteLine(ex.Message);
}
}
private async Task StartChat(){
while(running){
if(!hasConnected){
await SendMessage("dołączył/a do sesji", false);
hasConnected = true;
}
ClearConsoleLine();
Console.SetCursorPosition(0, Console.CursorTop - 1);
Console.Write("\n> ");
string? message = Console.ReadLine();
if(message == "!exit"){
await SendMessage("!exit", false);
await SendMessage("opuścił/a sesję", false);
running = false;
break;
} else {
await SendMessage(message ?? "", true);
}
}
}
private async Task SendMessage(string message, bool by_user){
try {
TcpClient client = new ();
await client.ConnectAsync(_targetIp, _targetPort);
Content data = new() { Sender = _name, IpAddress = $"127.0.0.1:{_port}", Message = message, SentAt = DateTime.Now, ByUser = by_user };
string json = JsonSerializer.Serialize(data);
using NetworkStream stream = client.GetStream();
using StreamWriter writer = new(stream, Encoding.UTF8) { AutoFlush = true };
await writer.WriteAsync(json);
if(by_user){
ClearConsoleLine();
Console.SetCursorPosition(0, Console.CursorTop - 2);
Console.WriteLine($"\n[{DateTime.Now}] Ja: {message}");
}
} catch(Exception ex){
if(userOnline)
Console.WriteLine($"[błąd] Nie udało się wysłać wiadomości: {ex.Message}");
}
}
void ClearConsoleLine(){
int cur = Console.CursorTop;
Console.SetCursorPosition(0, Console.CursorTop);
Console.Write(new string(' ', Console.WindowWidth));
Console.SetCursorPosition(0, cur);
}
}
public class Content {
public string Sender { get; set; } = "";
public string Message { get; set; } = "";
public string IpAddress { get; set; } = "";
public DateTime SentAt { get; set;}
public bool ByUser { get; set; }
}
+10
View File
@@ -0,0 +1,10 @@
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<OutputType>Exe</OutputType>
<TargetFramework>net9.0</TargetFramework>
<ImplicitUsings>enable</ImplicitUsings>
<Nullable>enable</Nullable>
</PropertyGroup>
</Project>
+24
View File
@@ -0,0 +1,24 @@
Microsoft Visual Studio Solution File, Format Version 12.00
# Visual Studio Version 17
VisualStudioVersion = 17.5.2.0
MinimumVisualStudioVersion = 10.0.40219.1
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "PeerToPeer_Messenger", "PeerToPeer_Messenger.csproj", "{DEBFE5BC-9B40-D7C4-B922-7DE39176AA46}"
EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|Any CPU = Debug|Any CPU
Release|Any CPU = Release|Any CPU
EndGlobalSection
GlobalSection(ProjectConfigurationPlatforms) = postSolution
{DEBFE5BC-9B40-D7C4-B922-7DE39176AA46}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{DEBFE5BC-9B40-D7C4-B922-7DE39176AA46}.Debug|Any CPU.Build.0 = Debug|Any CPU
{DEBFE5BC-9B40-D7C4-B922-7DE39176AA46}.Release|Any CPU.ActiveCfg = Release|Any CPU
{DEBFE5BC-9B40-D7C4-B922-7DE39176AA46}.Release|Any CPU.Build.0 = Release|Any CPU
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
EndGlobalSection
GlobalSection(ExtensibilityGlobals) = postSolution
SolutionGuid = {E4C633F1-4F75-4DEF-BAAD-CFFF486A78DB}
EndGlobalSection
EndGlobal
Executable
+35
View File
@@ -0,0 +1,35 @@
using System;
using System.Net;
using System.Net.Sockets;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
public class Program {
public static async Task Main(string[] args) {
string? targetIp = "";
int targetPort = 0;
try {
Console.Clear();
Console.WriteLine("Jak się nazywasz?");
string name = Console.ReadLine() ?? "User";
Console.WriteLine("Wybierz port, którym będziesz posługiwał się do P2P: ");
int port = int.Parse(Console.ReadLine() ?? "5000");
Console.WriteLine("Wpisz adres IP odbiorcy: ");
targetIp = Console.ReadLine();
Console.WriteLine("Podaj port odbiorcy: ");
targetPort = int.Parse(Console.ReadLine() ?? "5001");
Console.Clear();
var peer = new Peer(port, targetIp ?? "127.0.0.1", targetPort, name);
await peer.Start();
} catch(Exception ex){
Console.WriteLine(ex.Message);
}
}
}
Binary file not shown.
+23
View File
@@ -0,0 +1,23 @@
{
"runtimeTarget": {
"name": ".NETCoreApp,Version=v9.0",
"signature": ""
},
"compilationOptions": {},
"targets": {
".NETCoreApp,Version=v9.0": {
"PeerToPeer_Messenger/1.0.0": {
"runtime": {
"PeerToPeer_Messenger.dll": {}
}
}
}
},
"libraries": {
"PeerToPeer_Messenger/1.0.0": {
"type": "project",
"serviceable": false,
"sha512": ""
}
}
}
Binary file not shown.
Binary file not shown.
+12
View File
@@ -0,0 +1,12 @@
{
"runtimeOptions": {
"tfm": "net9.0",
"framework": {
"name": "Microsoft.NETCore.App",
"version": "9.0.0"
},
"configProperties": {
"System.Runtime.Serialization.EnableUnsafeBinaryFormatterSerialization": false
}
}
}
@@ -0,0 +1,4 @@
// <autogenerated />
using System;
using System.Reflection;
[assembly: global::System.Runtime.Versioning.TargetFrameworkAttribute(".NETCoreApp,Version=v9.0", FrameworkDisplayName = ".NET 9.0")]
+22
View File
@@ -0,0 +1,22 @@
//------------------------------------------------------------------------------
// <auto-generated>
// This code was generated by a tool.
//
// Changes to this file may cause incorrect behavior and will be lost if
// the code is regenerated.
// </auto-generated>
//------------------------------------------------------------------------------
using System;
using System.Reflection;
[assembly: System.Reflection.AssemblyCompanyAttribute("PeerToPeer_Messenger")]
[assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")]
[assembly: System.Reflection.AssemblyFileVersionAttribute("1.0.0.0")]
[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.0.0")]
[assembly: System.Reflection.AssemblyProductAttribute("PeerToPeer_Messenger")]
[assembly: System.Reflection.AssemblyTitleAttribute("PeerToPeer_Messenger")]
[assembly: System.Reflection.AssemblyVersionAttribute("1.0.0.0")]
// Generated by the MSBuild WriteCodeFragment class.
@@ -0,0 +1 @@
c424b8d42f3704b2cdc8e26f70ca6efef32bc8e32676eff8162a7edfb2be94ed
@@ -0,0 +1,15 @@
is_global = true
build_property.TargetFramework = net9.0
build_property.TargetPlatformMinVersion =
build_property.UsingMicrosoftNETSdkWeb =
build_property.ProjectTypeGuids =
build_property.InvariantGlobalization =
build_property.PlatformNeutralAssembly =
build_property.EnforceExtendedAnalyzerRules =
build_property._SupportedPlatformList = Linux,macOS,Windows
build_property.RootNamespace = PeerToPeer_Messenger
build_property.ProjectDir = /Users/krzysiek/Projekty/PRYWATNE/Desktopowe/CSharp/PeerToPeer_Messenger/
build_property.EnableComHosting =
build_property.EnableGeneratedComInterfaceComImportInterop =
build_property.EffectiveAnalysisLevelStyle = 9.0
build_property.EnableCodeStyleSeverity =
+8
View File
@@ -0,0 +1,8 @@
// <auto-generated/>
global using global::System;
global using global::System.Collections.Generic;
global using global::System.IO;
global using global::System.Linq;
global using global::System.Net.Http;
global using global::System.Threading;
global using global::System.Threading.Tasks;
Binary file not shown.
@@ -0,0 +1 @@
5edb3c008946c394435d37e2908a97d499b558e475364e8e500ae5707d605230
@@ -0,0 +1,14 @@
/Users/krzysiek/Projekty/PRYWATNE/Desktopowe/CSharp/PeerToPeer_Messenger/obj/Debug/net9.0/PeerToPeer_Messenger.GeneratedMSBuildEditorConfig.editorconfig
/Users/krzysiek/Projekty/PRYWATNE/Desktopowe/CSharp/PeerToPeer_Messenger/obj/Debug/net9.0/PeerToPeer_Messenger.AssemblyInfoInputs.cache
/Users/krzysiek/Projekty/PRYWATNE/Desktopowe/CSharp/PeerToPeer_Messenger/obj/Debug/net9.0/PeerToPeer_Messenger.AssemblyInfo.cs
/Users/krzysiek/Projekty/PRYWATNE/Desktopowe/CSharp/PeerToPeer_Messenger/obj/Debug/net9.0/PeerToPeer_Messenger.csproj.CoreCompileInputs.cache
/Users/krzysiek/Projekty/PRYWATNE/Desktopowe/CSharp/PeerToPeer_Messenger/bin/Debug/net9.0/PeerToPeer_Messenger
/Users/krzysiek/Projekty/PRYWATNE/Desktopowe/CSharp/PeerToPeer_Messenger/bin/Debug/net9.0/PeerToPeer_Messenger.deps.json
/Users/krzysiek/Projekty/PRYWATNE/Desktopowe/CSharp/PeerToPeer_Messenger/bin/Debug/net9.0/PeerToPeer_Messenger.runtimeconfig.json
/Users/krzysiek/Projekty/PRYWATNE/Desktopowe/CSharp/PeerToPeer_Messenger/bin/Debug/net9.0/PeerToPeer_Messenger.dll
/Users/krzysiek/Projekty/PRYWATNE/Desktopowe/CSharp/PeerToPeer_Messenger/bin/Debug/net9.0/PeerToPeer_Messenger.pdb
/Users/krzysiek/Projekty/PRYWATNE/Desktopowe/CSharp/PeerToPeer_Messenger/obj/Debug/net9.0/PeerToPeer_Messenger.dll
/Users/krzysiek/Projekty/PRYWATNE/Desktopowe/CSharp/PeerToPeer_Messenger/obj/Debug/net9.0/refint/PeerToPeer_Messenger.dll
/Users/krzysiek/Projekty/PRYWATNE/Desktopowe/CSharp/PeerToPeer_Messenger/obj/Debug/net9.0/PeerToPeer_Messenger.pdb
/Users/krzysiek/Projekty/PRYWATNE/Desktopowe/CSharp/PeerToPeer_Messenger/obj/Debug/net9.0/PeerToPeer_Messenger.genruntimeconfig.cache
/Users/krzysiek/Projekty/PRYWATNE/Desktopowe/CSharp/PeerToPeer_Messenger/obj/Debug/net9.0/ref/PeerToPeer_Messenger.dll
Binary file not shown.
@@ -0,0 +1 @@
60029226d177ef366457010af00a0d531f8a7c9ee1cea76d074eb032522c319d
Binary file not shown.
BIN
View File
Binary file not shown.
Binary file not shown.
Binary file not shown.
+69
View File
@@ -0,0 +1,69 @@
{
"format": 1,
"restore": {
"/Users/krzysiek/Projekty/PRYWATNE/Desktopowe/CSharp/PeerToPeer_Messenger/PeerToPeer_Messenger.csproj": {}
},
"projects": {
"/Users/krzysiek/Projekty/PRYWATNE/Desktopowe/CSharp/PeerToPeer_Messenger/PeerToPeer_Messenger.csproj": {
"version": "1.0.0",
"restore": {
"projectUniqueName": "/Users/krzysiek/Projekty/PRYWATNE/Desktopowe/CSharp/PeerToPeer_Messenger/PeerToPeer_Messenger.csproj",
"projectName": "PeerToPeer_Messenger",
"projectPath": "/Users/krzysiek/Projekty/PRYWATNE/Desktopowe/CSharp/PeerToPeer_Messenger/PeerToPeer_Messenger.csproj",
"packagesPath": "/Users/krzysiek/.nuget/packages/",
"outputPath": "/Users/krzysiek/Projekty/PRYWATNE/Desktopowe/CSharp/PeerToPeer_Messenger/obj/",
"projectStyle": "PackageReference",
"configFilePaths": [
"/Users/krzysiek/.nuget/NuGet/NuGet.Config"
],
"originalTargetFrameworks": [
"net9.0"
],
"sources": {
"/usr/local/share/dotnet/library-packs": {},
"https://api.nuget.org/v3/index.json": {},
"https://tizen.myget.org/F/dotnet/api/v3/index.json": {}
},
"frameworks": {
"net9.0": {
"targetAlias": "net9.0",
"projectReferences": {}
}
},
"warningProperties": {
"warnAsError": [
"NU1605"
]
},
"restoreAuditProperties": {
"enableAudit": "true",
"auditLevel": "low",
"auditMode": "direct"
},
"SdkAnalysisLevel": "9.0.200"
},
"frameworks": {
"net9.0": {
"targetAlias": "net9.0",
"imports": [
"net461",
"net462",
"net47",
"net471",
"net472",
"net48",
"net481"
],
"assetTargetFallback": true,
"warn": true,
"frameworkReferences": {
"Microsoft.NETCore.App": {
"privateAssets": "all"
}
},
"runtimeIdentifierGraphPath": "/usr/local/share/dotnet/sdk/9.0.202/PortableRuntimeIdentifierGraph.json"
}
}
}
}
}
+15
View File
@@ -0,0 +1,15 @@
<?xml version="1.0" encoding="utf-8" standalone="no"?>
<Project ToolsVersion="14.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<PropertyGroup Condition=" '$(ExcludeRestorePackageImports)' != 'true' ">
<RestoreSuccess Condition=" '$(RestoreSuccess)' == '' ">True</RestoreSuccess>
<RestoreTool Condition=" '$(RestoreTool)' == '' ">NuGet</RestoreTool>
<ProjectAssetsFile Condition=" '$(ProjectAssetsFile)' == '' ">$(MSBuildThisFileDirectory)project.assets.json</ProjectAssetsFile>
<NuGetPackageRoot Condition=" '$(NuGetPackageRoot)' == '' ">/Users/krzysiek/.nuget/packages/</NuGetPackageRoot>
<NuGetPackageFolders Condition=" '$(NuGetPackageFolders)' == '' ">/Users/krzysiek/.nuget/packages/</NuGetPackageFolders>
<NuGetProjectStyle Condition=" '$(NuGetProjectStyle)' == '' ">PackageReference</NuGetProjectStyle>
<NuGetToolVersion Condition=" '$(NuGetToolVersion)' == '' ">6.13.1</NuGetToolVersion>
</PropertyGroup>
<ItemGroup Condition=" '$(ExcludeRestorePackageImports)' != 'true' ">
<SourceRoot Include="/Users/krzysiek/.nuget/packages/" />
</ItemGroup>
</Project>
+2
View File
@@ -0,0 +1,2 @@
<?xml version="1.0" encoding="utf-8" standalone="no"?>
<Project ToolsVersion="14.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003" />
+74
View File
@@ -0,0 +1,74 @@
{
"version": 3,
"targets": {
"net9.0": {}
},
"libraries": {},
"projectFileDependencyGroups": {
"net9.0": []
},
"packageFolders": {
"/Users/krzysiek/.nuget/packages/": {}
},
"project": {
"version": "1.0.0",
"restore": {
"projectUniqueName": "/Users/krzysiek/Projekty/PRYWATNE/Desktopowe/CSharp/PeerToPeer_Messenger/PeerToPeer_Messenger.csproj",
"projectName": "PeerToPeer_Messenger",
"projectPath": "/Users/krzysiek/Projekty/PRYWATNE/Desktopowe/CSharp/PeerToPeer_Messenger/PeerToPeer_Messenger.csproj",
"packagesPath": "/Users/krzysiek/.nuget/packages/",
"outputPath": "/Users/krzysiek/Projekty/PRYWATNE/Desktopowe/CSharp/PeerToPeer_Messenger/obj/",
"projectStyle": "PackageReference",
"configFilePaths": [
"/Users/krzysiek/.nuget/NuGet/NuGet.Config"
],
"originalTargetFrameworks": [
"net9.0"
],
"sources": {
"/usr/local/share/dotnet/library-packs": {},
"https://api.nuget.org/v3/index.json": {},
"https://tizen.myget.org/F/dotnet/api/v3/index.json": {}
},
"frameworks": {
"net9.0": {
"targetAlias": "net9.0",
"projectReferences": {}
}
},
"warningProperties": {
"warnAsError": [
"NU1605"
]
},
"restoreAuditProperties": {
"enableAudit": "true",
"auditLevel": "low",
"auditMode": "direct"
},
"SdkAnalysisLevel": "9.0.200"
},
"frameworks": {
"net9.0": {
"targetAlias": "net9.0",
"imports": [
"net461",
"net462",
"net47",
"net471",
"net472",
"net48",
"net481"
],
"assetTargetFallback": true,
"warn": true,
"frameworkReferences": {
"Microsoft.NETCore.App": {
"privateAssets": "all"
}
},
"runtimeIdentifierGraphPath": "/usr/local/share/dotnet/sdk/9.0.202/PortableRuntimeIdentifierGraph.json"
}
}
}
}
+8
View File
@@ -0,0 +1,8 @@
{
"version": 2,
"dgSpecHash": "beA8EarBYH0=",
"success": true,
"projectFilePath": "/Users/krzysiek/Projekty/PRYWATNE/Desktopowe/CSharp/PeerToPeer_Messenger/PeerToPeer_Messenger.csproj",
"expectedPackageFiles": [],
"logs": []
}